【问题标题】:Can Abstract class be used that way or Should I use Interface?可以这样使用抽象类还是应该使用接口?
【发布时间】:2014-09-05 10:13:02
【问题描述】:

我敢肯定这个问题看起来很简单,但我还是想问。我正在阅读抽象类并找到了这个实时示例:

假设我们正在为 Apple 定义一个 iPhone 类,然后将它继承到 iPhone5 和 iPhone5s 的子类。实际上,我们不想要 iPhone 类的对象,因为我们首先需要知道 iPhone 的类型。所以 iPhone 类应该是一个抽象类,它包含所有子类的一些共同行为,如 Call()、SMS()。但是,我们也可以在 iPhone 类中添加一些抽象方法,如 Model() 和 Color(),这些方法必须在所有子类中实现,具体取决于手机。每当我们将 iPhone 类实现为子类时,比如 iPhone5s,我们不需要再为该类编写 Call 和 SMS 方法,只需要实现抽象方法即可。

但是我的朋友告诉我,这样的例子使用接口而不是抽象类可能会更好。所以我的问题是我应该创建一个 iPhone 类的接口而不是抽象类,还是这种方法好?请帮忙!

【问题讨论】:

  • 你的朋友有没有告诉你为什么他认为界面会更好,或者他只是假设它会更好?
  • @dcastro 他告诉我最好让你的方法保持抽象。但是,我认为这种方法效果很好,每当我们将 iPhone 类实现为子类时,比如 iPhone5s,我们就不需要再次为该类编写 Call 和 SMS 方法。它有助于避免代码重复。你怎么看?

标签: oop interface abstract-class


【解决方案1】:

接口和抽象类有不同的用途。接口用于专门声明类的接口必须是什么样子才能成为X。您可以使用它来定义 电话 必须提供的内容,例如call(number)sms(number, message) 方法。

抽象类是一个实现“有空格”。抽象类可以自己实现接口。您将使用抽象的 iPhone 类来实现您的 Phone 接口;您将所有 iPhone 通用的代码添加到该抽象类,并保留每个 特定 iPhone 模型必须自行实现的抽象方法。

interface Phone {

    public function call(number);
    public function sms(number, message);

}

abstract class iPhone implements Phone {

    public function call(number) {
        cellProvider = this.getCellProvider();
        cellProvider.makeCall(number);
        cellProvider.endCall();
    }

    /**
     * Every iPhone model will have different hardware,
     * must return instance of CellProviderInterface here.
     */
    abstract protected function getCellProvider();

    ...

}

class iPhone5S extends iPhone {

    protected function getCellProvider() {
        return this.qualcom12345Chip;
    }

    ...

}

【讨论】:

  • 很好的例子。只是一个问题,您为什么要创建“电话界面”。我们也可以在抽象类中编写相同的逻辑并且仍然遵循层次结构?
  • 当然,我只是强调不同的用例。接口允许您实现完全不同类型的东西,除了接口中声明的方法之外没有任何共同点;而类层次结构则强制执行更严格的层次结构。如果你愿意,你可以实现一个implements Phonecar;您显然不希望在您的 iPhone 类层次结构中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2012-08-04
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多