我确定这个问题看起来很简单,但我仍然想问。我正在阅读有关抽象类的内容并找到了这个实时示例:
假设我们正在为Apple定义一个iPhone类,然后将其继承到iPhone5和iPhone5s子类。实际上,我们不想要iPhone类的对象,因为我们首先需要知道iPhone的类型。所以iPhone类应该是一个抽象类,它包含所有子类的一些常见行为,如Call(),SMS()。但是,我们还可以在iPhone类中添加一些抽象方法,如Model()和Color(),这些方法必须在所有子类中实现,具体取决于手机。每当我们将iPhone类实现为子类,比如说iPhone5s时,我们不需要为类重新编写Call和SMS方法,我们只需要实现抽象方法。
但是我的朋友告诉我,这样的例子可能更好地使用接口而不是抽象类。所以我的问题是我应该创建一个iPhone类而不是抽象类的接口,还是这种方法很好?请帮忙!
答案 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;
}
...
}