C# 的继承(学习心得 19)

2023-11-16

继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易,利于重用代码和节省开发时间。

已有的类被称为的 基类,这个新的类被称为 派生类

继承的思想实现了 属于(IS-A) 关系。

例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A) 动物。

超级小白友好,讲解C#基础,每集5分钟轻松学习,拒绝从入门到放弃!

一、基类和派生类

一个类可以派生自 多个 类或接口。

语法:

<访问修饰符符> class <基类>
{
 ...
}
class <派生类> : <基类>
{
 ...

例:

using System;
namespace InheritanceApplication
{
   class Shape
   {
      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
      protected int width; 
     // protected:只有该类对象及其子类对象可以访问
     // 属性定义在方法后面也行
      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();
      }
   }
}

运行结果:

总面积: 35

二、基类的初始化

派生类继承了基类的成员变量和成员方法,因此父类对象应在子类对象创建之前被创建。

可以在 成员初始化列表 中进行父类的初始化。

例:

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();
      }
   }
}

运行结果:

长度: 4.5
宽度: 7.5
面积: 33.75
成本: 2362.5

三、C# 多重继承

多重继承指的是,一个类别可以同时从 多于一个 父类继承行为与特征的功能。

C# 不支持多重继承。但是,可以使用接口来实现多重继承。

例:

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 // interface 表示 C# 的接口
   {
      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();
      }
   }
}

运行结果:

总面积: 35
油漆总成本: $2450

总结:继承接口的意义

既然接口里面没有方法的具体实现,那还要接口做什么用呢?

答案是:为了规范和协作性。

接口下面定义的方法,依然继承了这个接口就必须实现,名字必须统一,比如我要计算一个A班级的平均成绩,定义一个接口,那继承以后,必须计算平均成绩,而且这个方法的名字还要统一,但是怎么计算,这个接口不管,由子类自由实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 的继承(学习心得 19) 的相关文章

随机推荐