关于c#:何时使用抽象类?

When to use abstract classes?

这是有关抽象类的msdn文章,但我真的不明白…

我什么时候真正应该使用抽象类?使用抽象类有什么好处?


当您需要一个类用于继承和多态性时,抽象类是有用的,但是实例化类本身是没有意义的,只有它的子类。当您希望为共享一些公共实现代码的一组子类定义模板时,通常会使用这些模板,但您也希望确保不能创建超类的对象。

例如,假设您需要创建狗、猫、仓鼠和鱼对象。它们具有类似的特性,如颜色、大小、腿的数量以及行为,因此您可以创建一个动物超类。然而,动物是什么颜色的?一个动物物体有几条腿?在这种情况下,实例化一个动物类型的对象并没有多大意义,只不过是它的子类。

抽象类在多态性方面也有额外的好处——允许您将(抽象)超类的类型用作方法参数或返回类型。例如,如果您有一个petowner类和train()方法,那么您可以将其定义为接收类型为animal的对象,例如train(animal A),而不是为animal的每个子类型创建方法。


通过使用抽象类,我们可以使类更通用。

例如:如果类A是抽象类,并且有类B、类C和类D扩展抽象类A,那么这些子类将继承一个已经在抽象类A中声明的方法,从而使该方法更通用。


您将它们用于永远不会被创建的类(实际上并不存在),但出于多态性的原因,您希望从它们继承。


Richard提供了一个例子:抽象类比非抽象类有优势。

我想添加一个事实表,用于在抽象类和接口之间进行选择。图片可以在这里找到。

enter image description here


在为类继承关系中的类定义永远不会用于直接实例化对象的行为时,请使用抽象类。

所以,暂时把你自己当作上帝。你的cbabyboy和cbanygirl类不会是抽象的,因为它们是可以被创建的实体对象。另一方面,您的cperson和canimal类是抽象的——从类型层次的角度来看,它们很有用,但您永远不会运行CAnimal dingbat = new Animal();


基本上,您应该使用一个抽象类,当您的层次结构中的某个实体在逻辑上具有它不知道如何实现的方法时,它的后代会这样做。网络上有数以亿计的"现实生活"例子,真的)