【问题标题】:abstract methods and classes: Concept behind? [duplicate]抽象方法和类:背后的概念? [复制]
【发布时间】:2014-02-08 00:26:15
【问题描述】:

拥有一个抽象类背后的整个概念到底是什么(在我的例子中,我指的是 java)。 我理解这样一个事实,即它太笼统而无法自行实现,因此没有用。但可以肯定的是,仅将其声明为非抽象类并使用与抽象类相同的继承会得到所有相同的结果。

主要优点是节省时间,但在没有方法主体的抽象超类中声明抽象方法,然后在其子类中覆盖它们?

【问题讨论】:

标签: java inheritance subclass abstract superclass


【解决方案1】:

假设您的基类有一个必须在任何有用的子类中重写的方法。如果您在基类中实现该方法,并且它没有被覆盖,则在您的虚拟方法体运行之前不会发现错误。如果将方法和类抽象化,编译时就会发现错误。

【讨论】:

  • 是的,所以它有点像安全机制?抽象类中的所有方法都需要抽象,即命名为抽象吗?
  • 不只是你想抽象的那些
  • 一旦你有了一个抽象方法,你也需要将类声明为抽象
  • 我推荐阅读this 了解抽象类和方法
  • 我认为它还增加了可读性。将方法声明为抽象方法但不提供方法主体比提供带有 cmets 的虚拟方法(指示它必须被覆盖)更清楚地表达了非实现。
【解决方案2】:

主要优点是您不能实例化抽象类。你可能有这样的Document 类:

public class Document {
    public void write(File file) {
        // I have no idea how to implement this
    }
    public void read(File file) {
        // I don't know here either
    }
}

您希望人们为他们的文档类型创建子类:

public class MyDocument extends Document {
    public void write(File file) {
        // Now I know how to implement
    }
    public void read(File file) {
        // this also can be implemented
    }
}

但你不希望人们制作新的Documents:

Document doc = new Document(); // this should not be allowed

你希望人们做这样的事情:

Document doc = new MyDocument();

解决办法是让Document抽象:

public abstract class Document

并使方法也抽象:

public abstract void write(File file);
public abstract void read(File file);

那么你不能实例化Document,但你可以实例化子类。子类必须覆盖 readwrite

【讨论】:

    【解决方案3】:

    当你不想创建一个类的对象时,你将一个类抽象,子类的公共方法可以在抽象超类中实现,另一个目的是你使方法抽象,以便子类必须实现超类抽象方法编写自己的实现。就这么简单。

    【讨论】:

      【解决方案4】:

      将抽象类视为在 API 中创建契约的一种方式。

      假设您正在创建一个程序,其中包含商店销售的商品列表。现在,这个列表当然会包含具有某些共同特征和某些个人特征的项目。但是我们不能出售“物品”——我们想出售“电视”或“桌子”。

      因此,您将创建一个抽象类“Item”,其中包含价格标签、制造日期等。但是,您永远不希望任何人创建 Item 类的实例,因为项目可以是任何东西。

      您希望程序员子类化并创建他们自己的 Item 类型的类,以履行 Item 所需的合同。反过来,API 允许您添加子类项目的类,以放入可用项目的商店列表中。这还将自动为这些类提供您在子类化时不需要考虑的功能,并要求您覆盖您必须为该类实现的方法。

      在 Java 中,方法不需要是抽象的,在抽象类中,可以像在普通类中一样实现。例如。如果你有一个 orice 标签,你可以为这个价格标签实现一个 getter - 不需要强制子类实现这个。

      希望这是有道理的。否则请随时发表评论,以便我详细说明。

      【讨论】:

      • 我想我开始明白了,谢谢,它基本上是为了控制,比如尝试控制实现哪些方法等,以及不浪费时间为一个如此通用的超类编写方法它通常没有用。我还可以问一下 OOP 中的大多数超类是否通常是抽象的?似乎这将是最明智的做法,因为大多数能够拥有许多子类的东西通常都很笼统?
      • 抽象,就其定义而言,是关于一般性的。如果我告诉你我有一只动物宠物,你只会知道我有一只宠物,但不知道是哪只。如果我说我有一只狗,那么我们会变得更具体,但你只能想象我有什么样的宠物。如果我告诉你我有一只柯基犬,你会突然知道我有什么宠物。 I Java Animal 可能被声明为一个接口,dog 可能是一个抽象类,而 Corgi 是一个普通类。
      • 为什么这很有趣?好吧,我的公寓可能不允许动物宠物,因此排除了任何一种动物,或者它可能允许猫但不允许狗,使用某些类型的动物而不是其他动物。抽象类型和通用性用于指定规则和合同。
      • 至于接口与抽象部分:我们可以说动物一般都需要进食和繁殖。他们如何做到这一点对于我们正在谈论的动物非常具体,因此无法说明如何(例如,Java 中的这些方法,根据它们的定义不能实现)。然而,我们可能会为狗实施这些,因为它们的食物和繁殖方式在所有狗种中或多或少都是相同的。
      猜你喜欢
      • 2016-02-15
      • 2011-04-23
      • 2012-11-29
      • 2017-06-11
      • 2012-10-24
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多