抽象类
abstract
修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。抽象类与非抽象类在以下方面是不同的:
- 抽象类不能直接实例化,并且对抽象类使用
new
运算符是编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为null
,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。 - 允许(但不要求)抽象类包含抽象成员。
- 抽象类不能被密封。
当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员。在下面的示例中
abstract class A { public abstract void F(); } abstract class B: A { public void G() {} } class C: B { public override void F() { // actual implementation of F } }
抽象类 A
引入抽象方法 F
。类 B
引入另一个方法 G
,但由于它不提供 F
的实现,B
也必须声明为抽象类。类 C
重写 F
,并提供一个具体实现。由于 C
中没有了抽象成员,因此可以(但并非必须)将 C
声明为非抽象类。