C# 何时使用抽象类?

C# 何时使用抽象类?,c#,.net,abstract-class,C#,.net,Abstract Class,这是MSDN的文章,但我真的不明白 什么时候应该真正使用抽象类?使用抽象类的优点是什么?基本上,当层次结构中的某个实体在逻辑上具有方法时,您应该使用抽象类,它不知道如何实现,但它的后代会实现。在web上有数以十亿计的“现实生活”示例(真的)当您在类继承权中定义一个永远不会直接用于实例化对象的类的行为时,请使用抽象类 所以,暂时把自己想象成上帝。您的CBabyBoy和CBanyGirl类不会是抽象的,因为它们是可以创建的实体对象。另一方面,您的CPerson和CAnimal类是抽象的——从类型层次

这是MSDN的文章,但我真的不明白


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

基本上,当层次结构中的某个实体在逻辑上具有方法时,您应该使用抽象类,它不知道如何实现,但它的后代会实现。在web上有数以十亿计的“现实生活”示例(真的)

当您在类继承权中定义一个永远不会直接用于实例化对象的类的行为时,请使用抽象类


所以,暂时把自己想象成上帝。您的CBabyBoy和CBanyGirl类不会是抽象的,因为它们是可以创建的实体对象。另一方面,您的CPerson和CAnimal类是抽象的——从类型层次结构的角度来看,它们很有用,但您永远不会运行
CAnimal dingbat=new Animal()

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

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


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

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

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

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

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

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


而不是“不知道”应该是“不能或不应该”。即使在基本形状对象示例中,draw方法也可以实现为空方法,但是否应该?有趣的观点)但我的意思是,空的实现不算当然=)动物将定义颜色、腿数、,所以当我把猫称为动物时,我热切地希望猫有颜色、腿的数量和大小。我还认为,您可以在基类中合法地实现这些属性,否则会导致代码重复。这里的描述有点涉及属性而不是方法,动物实现“移动”方法没有任何意义,因为每只动物可能有不同的移动方法,但它会定义对“移动”方法的需求。下面的答案也帮助我理解了什么是抽象类,我们不应该使用超类作为返回类型,因为它不太具体,这是一种不好的做法。返回类型应该更具体。如果Cat是返回类型,那么Animal就不应该被用作返回类型。MSDN关于抽象类的文章是一个严肃的笑话,令人伤心。