【问题标题】:When to use abstract classes?何时使用抽象类?
【发布时间】:2011-02-03 23:25:59
【问题描述】:

这是 abstract classes 上的 MSDN 文章,但我真的不明白...

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

【问题讨论】:

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

标签: c# .net abstract-class


【解决方案1】:

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

【讨论】:

  • 真正应该是“不能或不应该”,而不是“不知道”。即使在基本的 Shape 对象示例中,draw 方法也可以实现为空方法,但应该这样做吗?
  • 有趣的观点)但我的意思是,空的实现当然不算=)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • Animal 将定义对颜色、腿数和大小属性的需求,因此当将 Cat 称为 Animal 时,我热切期望 Animal 具有颜色、腿数和大小。我还认为您可以完全合法地在基类中实现这些属性,否则会导致重复代码。这里的描述有点被属性而不是方法所吸引,Animal实现“移动”方法没有意义,因为每只动物可能有不同的运动方法,但它会定义对“移动”的需求方法。
    • 下面的回答也帮助我理解了什么是抽象类stackoverflow.com/a/2558588/2188550
    • 我们不应该使用超类作为返回类型,因为它不太具体,这是一种不好的做法。返回类型应该更具体。如果 Cat 是返回类型,那么 Animal 不应用作返回类型。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        Richard 提供了an example,抽象类比非抽象类具有优势。

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

        【讨论】:

        猜你喜欢
        • 2016-02-01
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 2010-11-16
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        相关资源
        最近更新 更多