<C#高级编程>第4章笔记
第4章 继承
C#更类似于Java,只能单继承,但是可以派生于多个接口。
【与Java反义的:“实现”类,“派生”接口。】
实现继承
所有的实现继承都是public继承,语法上类似于C++,不用声明修饰符。形如
public class MyDerivedClass: MyBaseClass, IInterface1, IInterface2
{
// etc
}
若不定义实现的类,则默认认为其实现的是object。
对于结构体,不能实现其他类,但可以派生任意多个接口。形如
public struct MyDerivedStruct: IInterface1, IInterface2
{
// etc
}
类
虚方法
与C++的相似,与Java的不同。虚方法必须显示指定virtual关键字,否则不会重写。属性也可以声明为virtual。
另外,方法重写时必须强制使用override关键字,避免方法签名与基类版本并不一致。
隐藏方法
如果签名相同的方法在基类和派生类中都有声明,而又未声明为virtual和override。则派生类方法就会隐藏基类方法。此时调用哪个方法取决于引用对象的类型。
若要加上一个基类没有的方法,需要加上new关键字来显式声明要隐藏基类的方法。
定义后在新的版本中C#会提示用户不要试图通过引用类型是基类类型的子类对象来访问这个方法。
抽象类与抽象函数
同java相似,C#将抽象类和抽象函数用abstract修饰。同时,抽象函数也是virtual的,只是不要为其提供关键字。
密封类与密封方法
类似Java中的final,在C#中可以通过sealed关键字来修饰类和方法。
sealed类表示不能继承该类;sealed方法表示不能重写该方法。
修饰方法时必须与override一起用,如果自己的代码不想被人重写,不用virtual声明即可,
如果是override的方法,为防止再次重写,可以修饰为sealed。
接口
类似于Java中的接口。C#的接口中一般情况下只能包含方法、属性、索引器和事件的声明。
修饰符
可见性修饰符:
修饰符 |
应用于 |
说明 |
public |
所有的类型或成员 |
任何代码都可以访问该方法 |
protected |
类型和内嵌类型的所有成员 |
只有派生的类能访问该方法 |
internal(默认) |
类型和内嵌类型的所有成员 |
只能在包含它的程序集中访问该方法 |
private |
所有的类型或成员 |
只能在它所属的类型中访问该方法 |
protected internal |
类型和内嵌类型的所有成员 |
只能在包含它的程序集和派生类型的代码中访问该方法 |
其他修饰符:
修饰符 |
应用于 |
说明 |
new |
函数成员 |
成员用相同的签名隐藏继承的成员 |
static |
所有的成员 |
成员不在类的具体实例上执行 |
virtual |
仅类和函数成员 |
成员可以由派生类重写 |
abstract |
类 |
类不能实例化 |
abstract |
函数成员 |
虚拟成员定义了成员的签名,但没有提供实现 |
override |
仅函数成员 |
成员重写了继承的虚拟或抽象成员 |
sealed |
类 |
不能被其他类继承。 |
sealed |
函数成员 |
成员重写了继承的虚拟成员,但继承该类的任何类都不能重写该成员。必须与override一起使用。 |
extern |
仅静态方法(DllImport) |
成员在外部用另一种语言实现 |