C#高级编程读书笔记之继承

第四章 继承
4.1 继承的类型
4.1.1 实现继承和接口继承
在面向对象的编程中,有两种截然不同的继承类型:实现继承和接口继承
(1) 实现继承:表示一个继承派生于一个基类型,拥有该基类型的所有成员和函数。
(2) 接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。
4.1.2多重继承
一个c#类(除了Object类之外)都有一个基类,还可以有任意多个基接口。
4.1.3结构和类
结构不支持继承,但支持接口继承。定义结构和类可以总结为:
(1) 结构总是派生于System.ValueType,它们还可以派生于任意多个接口。
(2) 类总是派生于用户选择的另一个类,它们还可以派生于任意多个接口。
4.2 实现继承
4.2.1 虚方法
把一个基类函数声明为virtual,该函数就可以在派生类中重写了。也可以把属性声明为virtual。
C#要求在派生类的函数重写另一个函数时,要使用override关键字显示声明。
4.2.2 隐藏方法
如果签名相同的方法在基类和派生类都进行了声明,但该方法没有声明为virtual和override,派生类就会隐藏基类方法。
在大多数情况下,是要重写方法,而不是隐藏方法,因为隐藏方法会存在为给定类的实例调用错误方法的危险。
在c#中,应使用new关键字声明我们要隐藏一个方法(隐藏基类具有相同函数名和签名的方法)
4.2.3 调用函数的基类版本
C#有一种特殊的语法用于从派生类中调用方法的基类版本:base.<MethodName>()(在java中用super关键字实现)。
注意,可以使用base.<MethodName>()语法调用基类中的任何方法,不必在同一个方法中的重载中调用它。
4.2.4 抽象类和抽象函数
C#运行把类和函数声明为abstract,抽象类不能实例化,而抽象函数没有执行代码,必须在非抽象的派生类中重写。如果类包含抽象函数,则该类必须是抽象类。
4.2.5 密封和密封方法
C#允许把类和方法声明为sealed。对于类来说表示不能继承该类,对于方法来说,表示不能重写该方法。(java中对应sealed的关键字子final)
如果定义了一个新方法,但不想让别人重写它,首先不要把它声明为virtual。如果要重写某个基类方法,在派生类的重写方法使用sealed关键字确保该方法提供的代码为最终代码,其他人不能再重写它。
4.2.6 派生类的构造函数
构造函数的调用顺序是先调用System.Object,再按照层级结构由上而下进行,直到到达编译器要实例化的类为止。
4.3 修饰符
4.3.1 可见性修饰符
Public、proteced、internal、private、proteced internal
不要把类型定义为protected、private和protected intenal 因为这些修饰符对于包含在命名空间中的类型是没有意义的。因此这些修饰符只能应用于成员。但是,可以用这些修饰符定义嵌套的类型(即包含在其它类型中的类型),因为在这种情况下,内嵌的类型也有成员状态。如下:
Public class OuterClass
{
Protected class InnerClass
{
}
}
4.3.2 其它修饰符
下面的修饰符可以用于类型的成员,而且有不同的用途,在应用于类型时,其中的几个修饰符也是有意义的。如abstract和sealed
new 应用于函数成员 成员用相同的签名隐藏继承的成员。
static 应用于所有成员 成员不在类的具体实例上执行。
virtual 仅类和函数成员可用 成员可以由派生类重写
abstract 仅函数成员可用 虚拟成员定义了成员的签名,但没有提供实现的代码
override 仅函数成员可用 成员重写了继承的虚拟或抽象成员
sealed 应用于类 成员重写了继承的虚拟成员,但继承该类的任何类都不能重写该成员。该修饰符必须和override一起使用。
extern 仅静态方法 成员在外部用另外一种语言实现
4.4 接口
一般情况下,接口只能包含方法、属性、索引器和事件的声明。
在接口定义中还不允许声明成员上的修饰符。接口成员总是公共的,不能声明为虚拟或静态。
4.4.1 定义和实现接口
4.4.2 派生的接口

 


 

posted on 2009-04-03 08:36  边写边唱  阅读(267)  评论(0编辑  收藏  举报

导航