web-dev-qa-db-ja.com

いつ実装および拡張しますか?

  • いつimplementまたはextendを使用する必要がありますか?
  • 実際の例は何ですか?

これは正しいです?

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

予想される現実のシナリオ:私は、すべてが同じ設計に従う複数の支払いクラスを特徴とする電子商取引プラットフォームを持っています。新しい支払いクラスを追加する必要がある場合、interfaceの定義された設計に従うことは非常に簡単で、最初からすべてのビットとピースが確実に存在します。

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

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

79
Industrial

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

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

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

継承はOOPの大きな概念です。これは単なるPHPを超えています。 継承に関するウィキペディアの記事 およびおそらく ギャングによるデザインパターン4

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

58
Rafe Kettler

実装:

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

拡張:

extendクラスは、クラスのより具体的なバージョンが必要な場合に使用します。

例:

abstract class Animal {
    private String name;

    public void eat();
    public void sleep();
}

public interface Pet {
    public void play();
}

public class Dog extends Animal implements Pet {
    public void eat() {
        // do stuff
    }

    public void sleep() {
        // do stuff
    }

    public void play() {
        // do stuff
    }
}

public class Hippo extends Animal {
    public void eat() {
        // do stuff
    }

    public void sleep() {
        // do stuff
    }
}

どちらも動物なので、HippoとDogはどちらもAnimalを拡張します。しかし、犬だけがペットになれます!

4
Ahmad Mobaraki