抽象クラスとインターフェースの違いについて学んでいますが、実際の例がないと理論的な説明がわかりにくいです。私はそれを読みました:基本クラスを更新することにより、すべての継承クラスが変更で自動的に更新されます。一方、インターフェイスは一度作成すると変更できません。新しいバージョンのインターフェイスが必要な場合は、まったく新しいインターフェイスを作成する必要があります。誰かが私にこの行の実用的な例を提供していただければ、私は非常に感謝しています.楽しい一週間を願っています.
3 に答える
この例を考えてみましょう。駆動可能なインターフェイス、自動車の抽象化、および両方を使用する Pinto クラスがあります。
interface Drivable
{
public function go();
}
abstract class Automobile
{
public $type;
public function getType() {
return $this->type;
}
}
class Pinto
extends Automobile
implements Drivable
{
public function go() {
// code to make it go
}
}
で定義することにより、すべての自動車にメソッドを簡単に追加できますAutomobile
。そこに追加された新しいメソッドは、すべての拡張クラスで使用できます。
ただし、メソッドを Drivable インターフェースに追加する場合は、それを実装するすべてのクラスでそのメソッドを探して実装し、新しいメソッドを追加する必要があります。そうしないと、コンパイルされません。
たとえば、stop()
インターフェイスにメソッドを追加するとします。Pinto
メソッドがないため、すぐにエラーが発生しstop
ます。
抽象基本クラスは、拡張クラスが継承する機能を作成するためのものです。
インターフェイスは、このインターフェイスを使用するクラスによって実装する必要がある関数の厳密なセットを定義するためのものです。
抽象クラスがメソッドを抽象としてマークできるという点で、少し重複がありますが、実装は継承クラスに任せます。
インターフェイスは変更できます。継承するクラスにすべての変更を実装するだけで済みます。たとえば、SpaceShip インターフェイスを作成していて、CoolEnemyShip、StupidEnemyShip、PlayerShip があり、SpaceShip に新しい関数を追加して、Boost() 関数などの新しい関数を追加したとします。3 つの実装で Boost() 関数を実装する必要があります。クラス (CoolEnemyShip、StupidEnemyShip、PlayerShip)
一方、SpaceShip が基本クラスで、そこに Boost() 関数を実装した場合、すべての継承クラスで Boost() 関数が使用可能になります。それが主な違いです。それを理解するためにコード行は必要ありません。類推だけで十分に役立つはずです。