C#_继承详解

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。

当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类 ,这个新的类被称为派生类

继承的思想实现了 属于(IS-A) 关系。例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A) 动物。

基类和派生类

派生类只能有一个直接基类,但一个基类可以有多个直接派生类。继承是可以传递的。定义要从其他类派生的类时,派生类会隐式获得基类的所有成员(除了其构造函数和终结器)。派生类因而可以重用基类中的代码,而无需重新实现。在派生类中,可以添加更多成员。通过这种方法,派生类可扩展基类的功能。

C# 中创建派生类的语法如下:

cs 复制代码
<acess-specifier> class <base_class>{
 ...
}
class <derived_class> : <base_class>{
 ...
}

假设,有一个基类 Shape,它的派生类是 Rectangle:

cs 复制代码
using System;
namespace InheritanceApplication{
   class Shape {
      public void setWidth(int w){
         width = w;
      }
      public void setHeight(int h){
         height = h;
      }
      protected int width;
      protected int height;
   }

   // 派生类
   class Rectangle: Shape{
      public int getArea(){ 
         return (width * height); 
      }
   }
   
   class RectangleTester{
      static void Main(string[] args){
         Rectangle Rect = new Rectangle();

         Rect.setWidth(5);
         Rect.setHeight(7);

         // 打印对象的面积
         Console.WriteLine("总面积: {0}",  Rect.getArea());
         Console.ReadKey();
      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

cs 复制代码
总面积: 35

基类的初始化

派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。您可以在成员初始化列表中进行父类的初始化。

下面的程序演示了这点:

cpp 复制代码
using System;
namespace RectangleApplication{
   class Rectangle{
      // 成员变量
      protected double length;
      protected double width;
      public Rectangle(double l, double w){
         length = l;
         width = w;
      }
      public double GetArea(){
         return length * width;
      }
      public void Display(){
         Console.WriteLine("长度: {0}", length);
         Console.WriteLine("宽度: {0}", width);
         Console.WriteLine("面积: {0}", GetArea());
      }
   }//end class Rectangle  
   class Tabletop : Rectangle{
      private double cost;
      public Tabletop(double l, double w) : base(l, w){ }
      public double GetCost(){
         double cost;
         cost = GetArea() * 70;
         return cost;
      }
      public void Display(){
         base.Display();
         Console.WriteLine("成本: {0}", GetCost());
      }
   }
   class ExecuteRectangle{
      static void Main(string[] args){
         Tabletop t = new Tabletop(4.5, 7.5);
         t.Display();
         Console.ReadLine();
      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

cs 复制代码
长度: 4.5
宽度: 7.5
面积: 33.75
成本: 2362.5

C# 多重继承

C# 不支持多重继承。但是,您可以使用接口来实现多重继承。下面的程序演示了这点:

cs 复制代码
using System;
namespace InheritanceApplication{
   class Shape {
      public void setWidth(int w){
         width = w;
      }
      public void setHeight(int h){
         height = h;
      }
      protected int width;
      protected int height;
   }

   // 基类 PaintCost
   public interface PaintCost {
      int getCost(int area);

   }
   // 派生类
   class Rectangle : Shape, PaintCost{
      public int getArea(){
         return (width * height);
      }
      public int getCost(int area){
         return area * 70;
      }
   }
   class RectangleTester{
      static void Main(string[] args){
         Rectangle Rect = new Rectangle();
         int area;
         Rect.setWidth(5);
         Rect.setHeight(7);
         area = Rect.getArea();
         // 打印对象的面积
         Console.WriteLine("总面积: {0}",  Rect.getArea());
         Console.WriteLine("油漆总成本: ${0}" , Rect.getCost(area));
         Console.ReadKey();
      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

cs 复制代码
总面积: 35
油漆总成本: $2450
相关推荐
错把套路当深情7 分钟前
Kotlin保留小数位的三种方法
开发语言·python·kotlin
wangnaisheng41 分钟前
【C#】EventHandler的使用
c#
赵谨言1 小时前
基于Python Web的大数据系统监控平台的设计与实现
大数据·开发语言·经验分享·python
唐青枫1 小时前
C#.NET Cronos 实战:优雅解析与执行 Cron 表达式
c#·.net
专注前端30年1 小时前
Vue2 中 v-if 与 v-show 深度对比及实战指南
开发语言·前端·vue
星竹晨L2 小时前
C++继承机制:面向对象编程的基石
开发语言·c++
G_dou_3 小时前
Rust安装
开发语言·后端·rust
小白黑科技测评3 小时前
2025 年编程工具实测:零基础学习平台适配性全面解析!
java·开发语言·python
ejinxian4 小时前
Python 3.14 发布
java·开发语言·python
喜欢读源码的小白4 小时前
【Spring Boot + Spring Security】从入门到源码精通:藏经阁权限设计与过滤器链深度解析
java·开发语言·spring boot·spring security