1、C#在继承方面支持和不支持的功能。
- 单重继承: 表示一个类可以派生自一个基类。 C#就采用这种继承。
- 多重继承: 多重继承允许一个类派生自多个类。 C#不支持类的多重继承, 但允许 接口的多重继承。
- 多层继承: 多层继承允许继承有更大的层次结构。 类B派生自类A, 类C又派生自 类B。 其中, 类B也称为中间基类, C#支持它, 也很常用。
- 接口继承: 定义了接口的继承。 这里允许多重继承。
2、继承和C#的某些特定问题
2.1、C#不支持多重继承
C#的设计人员决 定不支持类的多重继承, 因为支持多重继承会增加复杂性, 还会带来一些开销。 而C#又允许类型派生自多个接口。 一个类型可以实现多个接口。 这说明, C#类可以 派生自另一个类和任意多个接口。 更准确地说, 因为System.Object是一个公共的基类, 所 以每个C#类(除了Object类之外) 都有一个基类, 还可以有任意多个基接口。
2.2 虚方法和抽象方法
1、虚方法
把一个基类方法声明为virtual为虚方法,虚方法需声明主体, 就可以在任何派生类中重写该方法,重写方法需要添加关键字“override”,如下所示:
public class Animal { public virtual string Sound() { return "默认声音"; } }
public class Cat : Animal
{
//可不重写方法
}
当派生类没有重新虚方法时,当调用改虚方法,会自动执行基类中的虚方法。重写虚方法后如需执行基类中的对应虚方法使用“base.方法名”即可。
2、抽象方法
把一个基类方法声明为abstract就是抽象方法, 抽象方法必须声明在抽象类(类需要声明为abstract类),抽像方法不能声明主体,派生类必须使用“override”进行重写、基类方法无主体不能进行访问。如下所示:
public abstract class Animal { public abstract string Sound() } public class Dog: Animal { public override string Sound() { return "汪...汪..."; } }
public class Cat : Animal { public override string Sound() { return "喵...喵..."; //必须重写方法 } }
总结:
派生类可访问基类中所有public属性、字段及方法;不能访问基类中私有字段属性及方法。访问权限使用关键字进行控制,如有兴趣可查询C#关键子相关资料。