コンポジションと継承の違いを探している人は、どこかでこの投稿を見つけました。
投稿によると、構成はコードの再利用において継承よりも優れています。
class Fruit {
// Return int number of pieces of peel that
// resulted from the peeling activity.
public int peel() {
System.out.println("Peeling is appealing.");
return 1;
}
}
class Apple {
private Fruit fruit = new Fruit();
public int peel() {
return fruit.peel();
}
}
class Example2 {
public static void main(String[] args) {
Apple apple = new Apple();
int pieces = apple.peel();
}
}
バックエンド クラスを変更する
class Peel {
private int peelCount;
public Peel(int peelCount) {
this.peelCount = peelCount;
}
public int getPeelCount() {
return peelCount;
}
//...
}
class Fruit {
// Return int number of pieces of peel that
// resulted from the peeling activity.
public Peel peel() {
System.out.println("Peeling is appealing.");
return new Peel(1);
}
}
// フルーツへの変更に対応するために // Apple を変更する必要があります
class Apple {
private Fruit fruit = new Fruit();
public int peel() {
Peel peel = fruit.peel();
return peel.getPeelCount();
}
}
// この Example2 の古い実装は // まだ問題なく動作します。
class Example1 {
public static void main(String[] args) {
Apple apple = new Apple();
int pieces = apple.peel();
}
}
これは、「バックエンドクラスのインターフェースが変更された場合、フロントエンドクラスの実装も変更されますが、そのインターフェースは変更されません」という投稿によると、私が得られなかったものです。
ここでのインターフェースは何ですか?実装は何ですか?
これは私の仮定です.IMが間違っている場合は教えてください??(多分すべてが間違っています).
フロントエンドクラスが依存しているため、バックエンドクラスはインターフェースですか?
フロントエンドクラスの実装はフロントエンドクラス内の実装コードですか?Example内のコードが依存しているため、フロントエンドクラスもインターフェース
ですか?
バックエンド インターフェースの変更がフロントエンドインターフェースに変更を加えていないため、これらは疎結合ですか? したがって、フロントエンド インターフェイスに依存するコードは引き続き機能します。
代わりに継承を使用すると、サブクラスはスーパークラスで密結合されますか? スーパークラスに変更するとサブクラスにも変更されるため、サブクラスに依存するコードは動作しない可能性があります。
Wny 継承は弱いカプセル化です。