C# 继承
继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。
当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的 基类 ,这个新的类被称为 派生类 。
继承的思想实现了 属于(IS-A) 关系。例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A) 动物。
基类和派生类
一个类可以继承自另一个类,被称为基类(父类)和派生类(子类)。
C# 不支持类的多重继承,但支持接口的多重继承,一个类可以实现多个接口。
概括来说: 一个类可以继承多个接口,但只能继承自一个类。
C# 中创建派生类的语法如下:
<访问修饰符>class<基类>{...}class<派生类>:<基类>{...}
派生类会继承基类的成员(字段、方法、属性等),除非它们被明确地标记为私有(private)。
派生类可以通过关键字base来调用基类的构造函数和方法。
classBaseClass{publicvoidSomeMethod(){// Method implementation}}classDerivedClass:BaseClass{publicvoidAnotherMethod(){// Accessing base class methodbase.SomeMethod();// Method implementation}}
假设,有一个基类 Shape,它的派生类是 Rectangle:
usingSystem;namespaceInheritanceApplication{classShape{publicvoidsetWidth(intw){width=w;}publicvoidsetHeight(inth){height=h;}protectedintwidth;protectedintheight;}// 派生类classRectangle:Shape{publicintgetArea(){return(width*height);}}classRectangleTester{staticvoidMain(string[]args){Rectangle Rect=newRectangle();Rect.setWidth(5);Rect.setHeight(7);// 打印对象的面积Console.WriteLine("总面积: {0}", Rect.getArea());Console.ReadKey();}}}
当上面的代码被编译和执行时,它会产生下列结果:
总面积: 35
基类的初始化
派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。您可以在成员初始化列表中进行父类的初始化。
下面的程序演示了这点:
usingSystem;namespaceRectangleApplication{classRectangle{// 成员变量protecteddoublelength;protecteddoublewidth;publicRectangle(doublel,doublew){length=l;width=w;}publicdoubleGetArea(){returnlength*width;}publicvoidDisplay(){Console.WriteLine("长度: {0}", length);Console.WriteLine("宽度: {0}", width);Console.WriteLine("面积: {0}", GetArea());}}//end class RectangleclassTabletop:Rectangle{privatedoublecost;publicTabletop(doublel,doublew):base(l, w){}publicdoubleGetCost(){doublecost;cost=GetArea()*70;returncost;}publicvoidDisplay(){base.Display();Console.WriteLine("成本: {0}", GetCost());}}classExecuteRectangle{staticvoidMain(string[]args){Tabletop t=newTabletop(4.5,7.5);t.Display();Console.ReadLine();}}}
当上面的代码被编译和执行时,它会产生下列结果:
长度: 4.5 宽度: 7.5 面积: 33.75 成本: 2362.5
继承接口(Interface Inheritance)
一个接口可以继承自一个或多个其他接口,派生接口继承了基接口的所有成员。
派生接口可以扩展基接口的成员列表,但不能改变它们的访问修饰符。
interfaceIBaseInterface{voidMethod1();}interfaceIDerivedInterface:IBaseInterface{voidMethod2();}
继承接口的实例可以通过以下方式来实现:
usingSystem;// 定义一个基接口interfaceIBaseInterface{voidMethod1();}// 定义一个派生接口,继承自基接口interfaceIDerivedInterface:IBaseInterface{voidMethod2();}// 实现派生接口的类classMyClass:IDerivedInterface{publicvoidMethod1(){Console.WriteLine("Method1 implementation");}publicvoidMethod2(){Console.WriteLine("Method2 implementation");}}classProgram{staticvoidMain(string[]args){// 创建 MyClass 类的实例MyClass obj=newMyClass();// 调用继承自基接口的方法obj.Method1();// 调用派生接口新增的方法obj.Method2();}}
以上实例中 MyClass 类实现了 IDerivedInterface 接口,因此必须提供 IDerivedInterface 中定义的所有方法,包括从 IBaseInterface继承的 Method1() 方法。 在 Main 方法中,我们创建了 MyClass 的实例 obj 并调用了它的方法。
输出结果为:
Method1 implementation Method2 implementation
C# 多重继承
多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。与单一继承相对,单一继承指一个类别只可以继承自一个父类。
C# 不支持多重继承 。但是,您可以使用接口来实现多重继承。下面的程序演示了这点:
usingSystem;namespaceInheritanceApplication{classShape{publicvoidsetWidth(intw){width=w;}publicvoidsetHeight(inth){height=h;}protectedintwidth;protectedintheight;}// 基类 PaintCostpublicinterfacePaintCost{intgetCost(intarea);}// 派生类classRectangle:Shape, PaintCost{publicintgetArea(){return(width*height);}publicintgetCost(intarea){returnarea*70;}}classRectangleTester{staticvoidMain(string[]args){Rectangle Rect=newRectangle();intarea;Rect.setWidth(5);Rect.setHeight(7);area=Rect.getArea();// 打印对象的面积Console.WriteLine("总面积: {0}", Rect.getArea());Console.WriteLine("油漆总成本: ${0}", Rect.getCost(area));Console.ReadKey();}}}
当上面的代码被编译和执行时,它会产生下列结果:
总面积: 35 油漆总成本: $2450