抽象クラスとインターフェイスの違いは何ですか?
PHPでは、abstractとinterfaceは概念や使われ方が異なります。
- 抽象クラス
- 継承するためのクラスであり、インスタンス化できないクラス。
- 抽象クラスには抽象メソッドと非抽象メソッドを含めることができます。
- 抽象メソッドは、実装の詳細を持たず、メソッドの宣言のみを持つメソッドです。
- 抽象クラスを継承したサブクラスは、抽象クラス内にあるすべての抽象メソッドを実装する必要があります。
- 抽象クラスは、プロパティ、定数、非抽象メソッドの具体的な実装を含めることができます。
ネイティブな日本語に言い換えてください、1つだけ必要です。
abstract class Animal {
protected $name;
abstract public function sound();
public function setName($name) {
$this->name = $name;
}
}
class Cat extends Animal {
public function sound() {
return 'Meow';
}
}
$cat = new Cat();
$cat->setName('Kitty');
echo $cat->sound(); // Output: Meow
- インタフェース
- インターフェイスは、クラスが実装するメソッドを定義する契約です。
- インターフェースには抽象メソッドと定数しか含めることはできず、プロパティやメソッドの具体的な実装を含めることはできません。
- インターフェイスを実装したクラスは、そのインターフェイスで定義されている全てのメソッドを実装する必要があります。
- 1つのクラスは複数のインターフェースを実装することができます。
コードの例をネイティブの日本語で言い換えてください。ひとつだけが必要です。
interface Animal {
public function sound();
}
interface Pet {
public function getName();
}
class Cat implements Animal, Pet {
public function sound() {
return 'Meow';
}
public function getName() {
return 'Kitty';
}
}
$cat = new Cat();
echo $cat->sound(); // Output: Meow
echo $cat->getName(); // Output: Kitty
つまり、abstractはクラスの継承および実装に使用され、具体的なメソッド実装とプロパティを含めることができますが、interfaceはクラスが実装すべきメソッドを定義するために使用され、抽象メソッドと定数のみを含めることができます。