可以使用抽象类或者我应该使用接口吗?

时间:2014-09-05 10:13:02

标签: oop interface abstract-class

我确定这个问题看起来很简单,但我仍然想问。我正在阅读有关抽象类的内容并找到了这个实时示例:

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

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

1 个答案:

答案 0 :(得分:2)

接口和抽象类有不同的用途。接口用于专门声明类的接口必须是什么样才能符合 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;
    }

    ...

}