1

「高レベル」コンポーネントは、他の「低レベル」コンポーネントに関して定義された動作を持つクラスです。この例は、Bulb クラスがその LightOn() 動作を実装するために Socket クラスを必要とすることです。

すべてのスーパークラスが高レベル コンポーネントであるわけではなく、すべてのサブクラスが低レベル コンポーネントであるとは限りません。以下の例があるためです。

ヘッドファーストデザインパターンからのテンプレートメソッドパターン。

public abstract class CaffeineBeverage {

    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();

    abstract void addCondiments();

    void boilWater() {
        System.out.println("Boiling water");
    }

    void pourInCup() {
        System.out.println("Pouring int cup");
    }
}

public class Coffee extends CaffeineBeverage {

    public void brew() {
        System.out.println("Dripping Coffee through filter");
    }

    public void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }
}

この例CaffeineBeverageでは、クラスにはビヘイビアがありますprepareRecipe()brew()この動作には、とのサブクラス実装が必要addCondiments()です。

つまり...これは、ここでCaffeineBeverage(スーパークラス)が高レベルのコンポーネントであり、Coffee(サブクラス)が低レベルのコンポーネントであることを意味します。

public class superClass {
    public go() {
        //super class implementation
    }
}

public class subClass extends superClass {
    public go() {
        //sub class implementation
    }
}

この場合、そのメソッドを実装するsuperClass必要はありません。subclassgo()

クラスにサブクラスを実装する必要がある抽象メソッドがある場合でも、スーパークラスが高レベルのコンポーネントであることを意味します。以下の例を参照してください。

public abstract class superClass {
    public abstract go();
}

public class subClass extends superClass {
    public go() {
        //subclass implementation;
    }
}

main() {
    superClass s = new subClass();
    s.go();
}

s は superClass オブジェクトではありません... s は subClass オブジェクトです。

4

1 に答える 1

1

すべてのスーパークラスがサブクラスの上位コンポーネントであるとは限らないというのは正しいでしょうか?

はい、そう言うのは正しいです...「コンポーネント」という言葉を正しい方法で使用していると仮定します。実際、原則として、継承はコンポーネントをモデル化しません。

例えば:

  public abstract class Mammal extends Animal {
      ....
  }

  public class Cat extends Mammal {
      ....
  }

猫は哺乳類の「構成要素」ではなく、哺乳類は動物の「構成要素」ではありません。これは、「構成」または「コンテナ」の関係をモデル化しているわけではありません。分類関係をモデル化しています。つまり、猫は「哺乳類」であり、哺乳類は「動物」です。


クラス名とメソッドの意味が矛盾しているため、最初の例は少し混乱/混乱しています(私の考えでは)。しかし、飲料製造装置をモデリングしているようです。それが正しければ、あなたが実際にモデリングしている関係は、「構成要素」/「一部」ではなく「ある」ことになります。


最後に、実際の世界との関係で、クラスと継承が「意味する」点にとらわれないでください。実際には、Java クラスが現実世界のものを直接モデル化するために使用されることはめったにありません。(実際のプログラムで猫やコーヒー メーカーをモデル化するクラスを目にすることはほとんどありません。) 継承の真の有用性は、コードに構造を提供する能力にあります... 現実世界を (大雑把に) モデル化する能力ではありません。

于 2012-04-22T00:11:51.110 に答える