C#高级编程(第4版)
http://book.csdn.net/bookfiles/140/
4.1继承的类型
4.1.1实现继承和接口继承
实现继承表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数。
接口继承表示一个类型只继承了函数的签名,没有继承任何实现代码。
4.1.2多重继承
C#不支持多重实现继承。而C#又允许类型派生于多个接口。这说明,C#类可以派生于另一个类和任意多个接口。因为System.Object是一个公共的基类,所以每个C#类(除了Object类之外)都有一个基类,还可以有任意多个基接口。
4.1.3 结构和类
结构总是派生于System.ValueType,它们还可以派生于任意多个接口。
类总是派生于用户选择的另一个类,它们还可以派生于任意多个接口。
注意C#不支持私有继承,如果在类定义中没有指定基类,C#编译器就假定System.Object是基类。
class MyClass //derives from System.Object
{}
4.2 实现继承
注意C#不支持私有继承
4.2.1 虚方法
把一个基类函数声明为virtual,该函数就可以在任何派生类中重写了
C#要求在派生类的函数重写另一个函数时,要使用override关键字显式声明
4.2.2 隐藏方法
如果函数定义相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual 和 override,派生类方法就会隐藏基类方法。
4.2.3 调用函数的基类版本
C#有一种特殊的语法用于从派生类中调用方法的基类版本:base.<MethodName>()。
4.2.4 抽象类和抽象函数
如果类包含抽象函数,该类将也是抽象的,也必须声明为抽象的。
C#允许把类和函数声明为abstract,抽象类不能实例化,而抽象函数没有执行代码,必须在非抽象的派生类中重写。
4.2.5 密封类和密封方法
C#允许把类和方法声明为sealed。对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写该方法。
4.2.6 派生类的构造函数
构造函数的调用顺序是先调用System.Object,再按照层次结构由上向下进行,直到到达编译器要实例化的类为止。
向基类构造函数传递参数:
public class class1
{
public class1(string msg)
{
MessageBox.Show(msg);
}
}
public class class2:class1
{
public class2(string name):base(name)
{
MessageBox.Show("def");
}
}
class2 c1 = new class2("abc");
4.3 修饰符
public
所有的类型或成员
任何代码均可以访问该方法
protected
类型和内嵌类型的所有成员
只有派生的类型能访问该方法
internal
类型和内嵌类型的所有成员
只能在包含它的程序集中访问该方法
private
所有的类型或成员
只能在它所属的类型中访问该方法
protected internal
类型和内嵌类型的所有成员
只能在包含它的程序集和派生类型的代码中访问该方法