什么时候使用抽象类?


77

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

我什么时候应该真正使用抽象类?使用抽象类的优点是什么?


关于抽象类的MSDN文章真是一个笑话,这很可悲。
Yusha

Answers:


141

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

例如,假设您需要创建“狗”,“猫”,“仓鼠”和“鱼”对象。它们具有类似的属性,例如颜色,大小和支脚数以及行为,因此您可以创建Animal超类。但是,动物是什么颜色?动物物体有几条腿?在这种情况下,实例化Animal类型的对象没有太大意义,而仅实例化其子类。

抽象类在多态性方面还具有额外的好处-允许您将(抽象)超类的类型用作方法参数或返回类型。例如,如果您有一个带有train()方法的PetOwner类,则可以将其定义为采用Animal类型的对象,例如train(Animal a),而不是为Animal的每个子类型创建方法。


15
动物会定义对颜色,腿数和大小属性的需求,因此当将猫作为动物来对待时,我非常希望动物具有颜色,腿数和大小。我还认为您可以相当合法地在基类中实现这些属性,否则将导致代码重复。这里的描述只是有点关注属性而不是方法,在Animal中实现“ Move”方法毫无意义,因为每只动物可能有不同的移动方法,但会定义对“ Move”的需求方法。
拉撒路

以下答案也帮助我了解了什么是抽象类stackoverflow.com/a/2558588/2188550
Ivanzinho,

我们不应该将超类用作返回类型,因为它的具体性较低,这是一种不好的做法。返回类型应该更具体。如果Cat是返回类型,则不应将Animal用作返回类型。
Ashish Kumar Jaryal '19

6

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

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


4

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


3

当您在类层次结构中为类定义行为时,请使用抽象类,该行为永远不会直接用于实例化对象。

因此,暂时将自己视为上帝。您的CBabyBoy和CBanyGirl类不会是抽象的-因为这些都是可以创建的固体对象。另一方面,您的CPerson和CAnimal类将是抽象的-从类型层次结构的角度来看,它们很有用,但您永远不会运行CAnimal dingbat = new Animal();



2

基本上,应该使用抽象类,当层次结构中的某些实体在逻辑上具有不知道如何实现的方法时,却由后代实现。实际上,整个网络上都有数十亿个“现实生活”示例)


3
与其说“不知道”,不如说应该是“不能或不应该”。即使在基本的Shape对象示例中,draw方法也可以实现为空方法,但是应该吗?
拉撒路

有趣的观点)但是我的意思是,空的实现当然不算在内)
n535 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.