首页 > 代码库 > 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#学习笔记 ----继承