首页 > 代码库 > C#学习笔记 ----继承
C#学习笔记 ----继承
在面向对象的编程中,俩种截然不同的继承类型:实现继承和接口继承。
实现继承:表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。
C#不支持多重实现继承
C#类可以派生自另一个类和任意多个接口
虚方法
把一个基类函数声明为virtual,就可以在任何派生类中重写该函数
可以把属性声明为virtual
C#要求在派生的函数重写另一个函数时,要使用override关键字显式声明
class MyBaseClass{ public virtual string VirtualMethod() { return "This Method is virtual and defined in MyBaseClass"; }}class MyDerivedClass:MyBaseClass{ public override string VirtualMethod() { return "This method is an override defined in MyDerivedClass"; }}
如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual 和override,派生类方法就会隐藏基类方法。
C#有一种特殊的语法用于派生类中调用方法的基类版本:base.<MethodName>()。
class CustomerAccount{ public virtual decimal CalculatePrice() { //implementation return 0.0 ; }}class GoldAccount:CustomerAccount{ public override decimal CalculatePrice() { return base,CalculatePrice() * 0.9M; }}
抽象类和抽象函数
C#允许把类和函数声明为abstract。
抽象类不能实例化,
而抽象函数不能直接实现,必须在非抽象的派生类中重写。抽象函数本身也是虚拟的(不需要提供virtual关键字)
如果类包含抽象函数,则该类也是抽象的,也必须声明为抽象的。
密封类和密封方法
C#允许把类和方法声明为sealed
对于类,表示不能继承该类;对于方法,表示不能重写该方法。
要在方法或属性上使用sealed关键字,必须先从基类上把它声明为要重写的方法或属性。
class MyClass:MyClassBase{ public sealed override void FinalMethod() { //etc. }}
派生类的构造函数
构造函数的调用顺序是先调用System.Object,再按照层次结构由上向下进行,直到达到编译器要实例化的类为止。
修饰符
public 任何代码均可以访问该项
protected 只有派生的类型能访问该项
internal 只能在包含它的程序集中访问该项
private 只能在它所属的类型中访问该项
protected internal 只能在包含它的程序集和派生类型的代码中访问该项
new 成员用相同的签名隐藏继承的成员
static 成员不作用与类的具体实例
virtual 成员可以由派生类重写
abstract 虚拟成员定义了成员的签名,但没有提供实现代码
override 成员重写了继承的虚拟或抽象成员
sealed 对于类,不能继承自密封类。对于属性和方法,成员重写已继承的虚拟成员,但是任何派生类中的任何成员都不能重写该成员。该修饰符必须与override一起使用。
extern 成员在外部用另一种语言实现(仅静态[DllImport]方法)
接口
一般情况下,接口只能包含方法、属性、索引器和事件的声明
接口不能有构造函数
不能有字段
也不允许包含运算符重载
不允许声明关于成员的修饰符
接口成员总是公有的,不能声明为虚拟或静态
接口可以彼此继承,其方式或类的继承方式相同。
C#学习笔记 ----继承