抽象类是abstract修饰符用于表示所修饰的类是不完整的,并且它只能作用基类.抽象类与非抽象类在以下方面是不同的
1抽象类不能直接实例化,并且对抽象类使用new运算符是编译时错误.虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为null,或者含有对非抽象类的实例引用(此非抽象类是从抽象类派生的)
2. 允许(但不要求)抽象类包含抽象成员
3.抽象类不能被密封
当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有成员,从而重写那些抽象成员.eg.
abstract class A
{
public abstract void F();
}
abstract class B:A
{
public void G(){}
}
class C:B
{
public override void F()
{
//actual implenmentation of F
}
}
抽象类A引入抽象方法F,类B引入另一个方法G,但由于它不提供F的实现,B也必须声明为抽象类.类C重写F,并提供一个具体实现.由于C中没有抽象成员,因此可以(但并非必须)将C声明为非抽象类.
在.NET Framework中,接口可以拥有静态成员,嵌套类型,抽象,虚拟成员,属性和事件.实现接口的任何类型必须提供接口中所声明的抽象成员的定义.
接口和抽象类的区别如下:
1.接口中不能有非抽象方法,但抽象类中可以有
2.一类能实现多个接口,但只能有一个父类
3.接口并不属于继承结构,它实际与继承无关,因此无关的类也可以实现同一个接口
4.抽象类是一个不完整的类,需要进一步细化;而接口只是一个行为的规范
5.接口基本不具备继承的任何基本铁点,它只是承诺了能调用的方法
6.接口可以用于支持回调(callback),但是继承不行.用于回调的接口只是提供指向方法的指针,而且是一个类型安全的指针方式.