C#抽象类

来源:互联网 发布:水手怕水 知乎 编辑:程序博客网 时间:2024/06/06 09:07

在C#中使用关键字 abstract 来定义抽象类和抽象方法。


First ——abstract和virtual关键字的区别与联系

联系

它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的。毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的。

区别1

  virtual(虚拟的)

这表是这个方法式有方法实体的,即这个方法可以像一般方法使用

abstract

(抽象的)

表示这个方法只有一些基础的构架,必须要在子类中将这个方法写出这个方法的实体以后,这个方法才能像正常的方法一样使用,这样做的目的:比如我只是在构架整个软件框架的时候想到要有这么一个功能,但是还没有具体想好这个功能怎么实现,那么就可以先写一个抽象方法,待以后有灵感的时候再实现

区别2

virtual可以被子类重写,不重写也可以像正常函数一样使用,如果重写了virtual修饰的方法,前面必须添加override

而abstract必须被子类重写


second——抽象类

"一个包含一个或多个纯虚函数的类叫抽象类,抽象类不能被实例化,进一步一个抽象类只能通过接口和作为其它类的基类使用."

1 抽象方法可以继承于接口(当然也可以单独定义),一个抽象类必须为所有的接口成员提供实现


2.抽象类不能被实例化


3一个包含抽象方法的类必然是抽象类,但是抽象类里面可以有非抽象方法,抽象方法的声明只能在抽象类中。

一个抽象类可以包含抽象和非抽象方法,当一个类继承于抽象类,那么这个派生类必须实现所有的的基类抽象方法。

但是通过声明派生类也为抽象,我们可以避免所有或特定的虚方法的实现,(就是A是抽象类,B继承A,只要B也是抽象类,那么B就不必要实现A中的所有抽象方法)


3.不能把抽象类用密封(sealed)来修饰,因为抽象类就是用来被继承,然后在继承的子类中实现方法,sealed关键字是不让这个类被继承。


4抽象类可以包含抽象方法和抽象属性,也可以包含普通的类成员。

从抽象类派生的非抽象类必须实现全部的抽象方法和抽象属性,包括继承来的