概念レベルのオブジェクト指向プログラミングの概念について話すとき、Car Objectを作成すると仮定します。したがって、親クラスを設計する必要があります。その部分を実行する場合、どのように実行しますか?
クラスまたはインターフェースまたは抽象クラスを使用しますか?では、なぜインターフェースを使用するのでしょうか。クラス/抽象クラスで同じことができないのはなぜですか?インターフェイスを親として使用することの利点は何ですか?
概念レベルのオブジェクト指向プログラミングの概念について話すとき、Car Objectを作成すると仮定します。したがって、親クラスを設計する必要があります。その部分を実行する場合、どのように実行しますか?
クラスまたはインターフェースまたは抽象クラスを使用しますか?では、なぜインターフェースを使用するのでしょうか。クラス/抽象クラスで同じことができないのはなぜですか?インターフェイスを親として使用することの利点は何ですか?
スーパークラスをインスタンス化したくないが、いくつかの機能を実装したい場合は、抽象クラスが必要です。
単一の親の継承があり、抽象クラスを使用できない場合は、インターフェイスが必要です。Javaに多重継承があった場合、それはあなたが使用する用語に従って話していると思いますが、インターフェースは冗長になります。
さて、あなたのCarオブジェクトを使用して、実際の例で概念を説明しようと思います。
あなたが車の部品を製造する小さな会社(A)であり、クライアントであるより大きな会社(B)のためにそれらを製造し、その部品が他の自動車製造業者によって使用されると想像してください。
B社は、あなたの部品が標準に準拠し、すべての自動車製造業者内で互換性があることを確認する必要があります。
それはあなたのインターフェースです。
インターフェイスは、いくつかの標準化されたメソッドまたは属性を定義するために使用されます。この例では、ピースの各コーナーに4つの穴があり、別の会社によって作成された別のピースに固定されるように定義できます。
抽象は少し異なり、抽象はインターフェースよりも具体的です(私はそれが一種のナンセンスであることに同意します)が、それらは機能を直接実装するため(たとえばインターフェース)、その抽象クラスは インスタンス化できないため、具体的です。
抽象クラスは主に、DRYにするための基本機能または共有機能を定義するために使用されます。
したがって、抽象クラスを拡張し、インターフェースを実装するクラスを作成できます。
次に例を示します。
interface Vehicle {
protected $engine;
protected $wheels;
public function startUp();
public function stop();
}
Vehicleインターフェースは、エンジンとホイール(任意の数)を必要とするVehicleを定義します。
abstract class Car implements Vehicle {
protected $wheels = 4;
public function startUp() {
$this->engine->startUp();
}
public function stop() {
$this->engine->stop();
}
}
startUp()
とはEngineオブジェクトの単なるプロキシであるためstop()
、それらを抽象クラスに入れて、すべての拡張クラスで再利用できます。車のクラスを4つの車輪に設定しました。
class Renault extends Car {
protected $color = 'yellow';
}
ここでは、Car抽象クラスを拡張する必要があります。クールなので色を追加します。
ここで、ルノーを洗車ステーションに持ち込みたいとしましょう。既知のインターフェースを実装しているため、洗車ステーションは、車両がルノーであることを知らなくても機能することができます。車両。
これは本当に基本的な例であり、より適切に設計できますが、どのように機能するかを示す必要があります。
インターフェースは必要ありません。少なくともPHPは、インターフェースを実装するためのクラスを必要としませんが、インターフェースを使用する必要があります。これは多くの場合、優れたプラクティスであり、APIの記述、単体テスト、または他の開発者間でのコードの共有に役立ちます。
深くなりすぎたり、メロドラマ的になりすぎたりする危険を承知で、私はできる限りあなたの質問に答えようとします.
あなたが提示した例のコンテキスト内では、抽象的な「車両」クラスを持つ「車」クラスが最も適切なソリューションになります。これは、車が許せば非常に複雑なオブジェクトになる可能性があるためです。すべてを car クラスに詰め込む代わりに、 vehicle クラスを作成して、任意の高レベル データの一部を抽象化することができます。これは、後でより多くの機能を実装したり、飛行機などの他のタイプの車両を作成したりする予定がある場合に非常に便利です。抽象クラスを使用すると、アプリケーションの柔軟性が向上します。必要に応じて、車両クラスを抽象化することもできます。概念的には、OOP は、抽象化と分類の観点から、コードを私たち全員が考えるように配線された方法に関連付けることです。ただし、単純な機能セットを実装する場合は、単純なクラスで十分です。
インターフェースはまったく別物です。インターフェイス (コンピューティングの観点から) は、プログラマーが実装とアプリケーションの間に分離レイヤーを作成できるようにする概念的なツールです。たとえば、サウンド カードと通信するプログラムを作成する場合は、インターフェイス クラスを作成する必要があります。実際、それが本質的にデバイス ドライバーです。Java などの一部の言語には、同じ概念を表す組み込みのインターフェース構造があります。ただし、理論的には、どの言語でもインターフェイスを作成できます。
単純な機能には、単純なクラスを使用できます。クラスはオブジェクトのインスタンス化に使用されます。抽象 (または基本) クラスは、クラスからデータを抽象化して基本機能を作成するためのものです。どちらの場合も、アプリケーションの実装に直接関係しないコードをそれぞれ処理します。ただし、これらの概念ツールは、同じ意味で使用されるべきではありません。これがソフトウェア エンジニアとプログラマーの違いです。適切なツールをいつ使用するかを知ることと、ツールをどのように使用するかを知ることです。
先ほど説明したように、インターフェースを使用して実装をアプリケーションから分離する必要があります。デバイス ドライバーと通信する場合は、GUI のコードを混在させたくありません。インターフェイスは、2 つの間の連絡役のように機能します。技術的には、インターフェイスは継承されずに「実装」されます。ただし、明確なインターフェース構造を持たない言語では、クラスは概念をシミュレートするために使用されるため、継承元になります。
抽象クラスは、他のエンティティを一般化する概念があるが、「現実世界」の具体化がない場合に役立ちます。
Car
プログラムにクラスがあり、 、および から派生したクラスがあるHummerH2
とToyotaCamry
しDaewooMatiz
ますCar
。Car
はSome-Abstract-Carであり、すべての車はクラスに属しますCar
が、Car
クラス自体は実際の車を示しません。
Car
したがって、次のようにクラスを定義できます。
abstract class Car
{
public abstract void Move();
public abstract void Stop();
public abstract int GetMaximumSpeed();
public int GetVehicleID()
{
return vehicleID;
}
protected int vehicleID;
}
そして、あなたを派生HummerH2
させToyotaCamry
、DaewooMatiz
からCar
実装しMove()
、そこに。クラスはそのサブクラスにフィールドを持つように強制することに注意してください。Stop()
GetMaximumSpeed()
Car
vehicleID
インターフェイスは、インターフェイスでフィールドを宣言できないことを除いて、抽象クラスに似ています。インターフェイスは、クラスが実装する必要があるいくつかのパブリック機能を宣言するために使用されます。
この場合、インターフェイス IMovable を宣言できます。
interface IMovable
{
void Move();
void Stop();
abstract int GetMaximumSpeed();
}
次に、IMovable から Car クラスを継承します。
abstract class Car: IMovable
{
public int GetVehicleID()
{
return vehicleID;
}
protected int vehicleID;
}
のサブクラスが実装およびメソッドを実装するCar
必要があることに注意してください。Move()
Stop()
Ship
さらに、インターフェイスを実装するクラスを定義できIMovable
ます。この場合、 と の両方Ship
をオブジェクトCar
として移動することができIMovable
、それが車であるか船であるか、またはIMovable
インターフェイスを実装するものであるかどうかに関係ありません。
PS : もちろん、1 種類の車しかない単純なゲームを作成する場合は、非抽象クラスCar
を定義して使用できます。
簡単な説明があります。A を拡張するクラス B があるとします。今、U は B クラスでクローニングを行いたいか、または U はソートを行いたいと考えています。Clonable class/Comparable classを作成した場合、Bでそれをどのように使用できますか? B coz BはすでにAを拡張しています.したがって、解決策は、clonable classを拡張する別のクラスDを作成することです.Dを拡張する別のクラスEを作成します(クローニングメソッドを使用するため) )そして....つまり、Javaは多重継承をサポートしていないため、disを行うクラスを作成する必要はありません.. B クラス。つまり、余分なコーディングは必要ありません。これは私がインターフェイスを作る理由の説明でした。どこか間違っている場合は修正してください。ありがとう。