あなたのクラスを説明する青写真としてインターフェイスを考えるようにしてください。
インターフェイスを使用する主な理由は、実装をスワップする機能として提供されることです。
クラスがインターフェイスを実装する場合、インターフェイスに定義されているこれらのメソッドを提供する必要があるという契約に署名します。この2つのクラスがこの特定のインタフェースを実装しているとします。今、彼らはこれらの方法を提供する契約を結んだ。ここまでは順調ですね。あなたがよく聞くかもしれない言葉は、インターフェイスへのプログラムです。 2つのクラスが契約を実装する場合、自由にスワップできます。以下の例を考えてみましょう。
interface CarInterface
{
public function hasName();
public function hasEngine();
public function accelerate();
}
class toyota{
public function hasName(){
//implementation
}
public function hasEngine(){
//implementation
}
public function accelerate(){
//implementation
}
}
class opel{
public function hasName(){
//implementation
}
public function hasEngine(){
//implementation
}
public function accelerate(){
//implementation
}
}
今、私たちは車を必要とする1つのクラスを持つことができます。
class circuit{
protected $car;
public function __construct(CarInterface $car)
{
$this->car=$car;
}
public function startRace(){
$this->car->accelerate();
}
}
[OK]を、私たちはgo.Imagineに設定されている私たちは、クラス回路をinstatiateする必要があります。その新しいインスタンスにオブジェクトを渡さなければなりませんが、どのオブジェクトですか?インタフェースを実装するANYオブジェクト型キャストしたので、具体的な実装ではなくインターフェイスにプログラミングしました。
$circuit = new circuit(new toyota);
$circuit->startRace();
私たちはオパール車を走らせる回路が必要なので、後でそれを変更する必要があります。問題ない。
$circuit = new circuit(new opel);
$circuit->startRace();
インターフェイスにプログラミングしたので、実装を自由に交換できます。これが主な利点です。私がここで話す科目について読んでください。あなたの頭をこのコンセプトの周りに包み込むのは難しいですが、一度使用すればいつでも使用できます。今は少しはっきりしていることを願っています。
これは一般的にインターフェイスの価値が何であるか聞いているようです。 – Carcigenicate
@Carcigenicateインターフェイスに対してのヒントと具体的な実装からの再利用性/デカップリングは全く異なるものです。私は一般的なインターフェイスの値を参照してください。私は、クラスを構築するために4-5のインターフェースを接続することで値を見ません。 –
私はちょうど明確にしたいと思った。私は "気づいている"か "有能な"インターフェースが何を表しているのか分かりませんが、単に "メソッドを追加するだけではどうでしょう..."と言われたとき、一般的にインターフェースを使うことに反対する人のようでした。そうでない場合はNvm。 – Carcigenicate