いつ実装して拡張するのですか?[閉まっている]


91
  • ときにすべきimplementか、extend使用できますか?
  • 実際の例は何ですか?

これは正しいです?

実装は、特定のメソッドがクラスに存在し、これらのメソッドの関数呼び出しが適切にフォーマットされていることを強制する方法のようです。実装は、変数または「設定」をクラスに渡す方法ではありませんか?

予想される実際のシナリオ:すべて同じ設計に従う複数の支払いクラスを備えたeコマースプラットフォームがあります。新しい支払いクラスを追加する必要がある場合は、の定義された設計に従ってinterface、最初からすべての要素が確実に存在するようにするのは非常に簡単です。

クラスを拡張すると、拡張(子?)クラスは、private?として宣言されたメソッドと変数を除いて、親クラスからすべてを継承します。

予想される実際のシナリオ:sessionsという名前の2つの子クラスで呼び出される1つのクラスがsessioncookiesありdatabasesessionsます。sessioncookiesまたdatabasesessions、親セッションから多数の相互構成オプションを一緒に継承するため、構成オプションを簡単に変更して、あらゆる種類の最終的な訪問者データストレージに影響を与えることができます。


1
継承についてよく読んでおくことをお勧めします。
Rafe Kettler 2011

回答:


64

継承は、書き直すコードの量を減らすのに役立ちます。いくつかの共通のメソッドまたはフィールドを持つ複数のクラスがある場合、これらのメソッドとフィールドを何度も定義する代わりに、それらを基本クラスに分解して、各子クラスにその基本クラスを拡張させることができます。

インターフェイス(およびimplements)は、オブジェクトのグループがどのように動作するかについて共通のプロトコルを定義する場合に役立ちます。たとえば、比較可能なオブジェクトの同等性とハッシュ化などを比較できるようにする必要がある場合があります。

継承の使用は、最終的には設計上の選択です。複数のクラスにわたって同じメソッドを定義する場合に注意してください。これらは、これらのメソッドを基本クラスに分解できる優れたケースです。同じ特性のいくつかを観察するクラスについても同じことが言えます。これらの特性を、関連するクラスによって実装されるインターフェースに配置することで、一貫性を保証できます。

継承は、PHPだけにとどまらないOOPの大きな概念です。Gang ofFourによる継承とおそらくデザインパターンに関するウィキペディアの記事を読むことをお勧めします。

相続についてのあなたの理解は主に正しいと思います。次のステップは、本番環境で使用することです。


4
現在、多くの人々は、The Gang of Fourの本を、デザインパターンの紹介として、素材の点で重すぎると考えています。人気のある代替手段は、ヘッドファースト:より軽い読書を可能にするデザインパターンです。amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan 2012年

1
「複数のクラスにわたって同じメソッドを定義する場合に注意してください。これらは、それらのメソッドを基本クラスに分解できる優れたケースです。」クラスを拡張すると、トレイトを使用してこれらのメソッドを定義するよりもメリットがありますか?
ダニエルワイナー2015年

1
「継承は、書き直すコードの量を減らすのに役立ちます」-継承の目的は、コードではなく動作を共有することです。可能な場合、特性は、他の方法では共通点がない具体的なクラスで抽象クラスを拡張するのではなく、コードを共有する方法です。通常、クラスをisではなくhasの関係としてモデル化することもできます。これにより、コードの再利用性とポリモーフィズムの両方がさらに容易になります。
ダンカン

14

実装:

インターフェイスは抽象クラスであるため、宣言できるのは物事だけです。クラスはインターフェースを実装します。複数のインターフェースを実装できます。

拡張:

あなたは延長したい時にクラスをより具体的なバージョンのクラスのを。

例:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

キャメルとドッグはどちらも動物なので、Animalクラスを拡張します。しかし、唯一の犬はある特定の種類AnimalものをすることができPet

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.