5.继承
引言:本博文主要介绍上篇博文所介绍的关于c#的类的继承问题,在面向对象的编程中,分为实现继承和接口继承。结构不能继承,但是可以派生自多个接口。
如果声明派生自另一个类的一个类,可以使用以下的语法;
class MyClass:MyBaseClass { //some functions }
5.1 虚方法
把一个方法声明为virtual,就可以在任何派生类中重写该函数:
class MyBaseClass { public virtual string VirtualMethod() { return "This method is virtual and defined in MyBaseClass"; } }
属性也可以声明为virtual,用法与非虚属性相同,这里只讨论方法。在派生类中重写另一个函数时,需要使用override关键字声明,比如重写上面的虚方法,可以使用以下代码:
class MyClass:MyBaseClass { public override string VirtualMethod() { return "This method is an override defined in MyClass"; } }
注意:成员字段和静态函数都不能声明为virtual,因为只对类的实例函数成员才有意义。
5.2 隐藏方法
如果在基类和派生类中都声明了签名相同的方法,但是该方法没有声明为virtual何override,基类的方法就会被隐藏。但是如果要隐藏的是派生类的方法,可以在方法声明时加上new关键字。
5.3 调用函数的基类版本
c#支持在派生类中调用方法的基类版本:base.<MethodName>()。下面的代码演示了在派生类中返回基类方法的90%得值:
class CustomerAccount { public virtual decimal Price() { return 0.0M; } } class GoldAccount:CustomerAccount { public override decimal Price() { return base.Price()*0.9M; } }
5.4 其它小概念
- 类与函数可以声明为abstract,抽象类不能实例化,抽象函数不能直接实现,必须在非抽象的派生类中重写。如果类包含抽象函数,那么也必须把这个类声明为抽象的。
- 类和方法还可以声明为sealed,这种类不能被继承,这种方法不能重写。
5.5 派生类的构造函数
在创建派生类的实例时,实际上有多个构造函数在起作用,要实例化的类的构造函数本身不能初始化类,它必须调用基类的构造函数。最先执行的是基类的构造函数,然后一级一级往下执行,派生类的构造函数可以在执行的过程中调用它可以访问的基类的任何方法、属性、其他成员。
本博客文章版权归博客园和sharp也疯狂共同所有。

浙公网安备 33010602011771号