是不是说所有超类都不是子类的高级组件?

时间:2012-04-21 23:30:32

标签: java design-patterns

“高级”组件是具有根据其他“低级”组件定义的行为的类。这样的示例是Bulb类需要Socket类来实现其LightOn()行为。

并非所有超类都是高级组件,并非所有子类都是低级组件。由于以下示例。

来自头部设计模式的模板方法模式。

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并不需要subclass来实施其go()方法。

即使一个类有抽象方法需要子类来实现它,DOESNT意味着超类是高级组件。见下面的例子。

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对象......这里是subClass对象。

1 个答案:

答案 0 :(得分:1)

  

是不是说所有超类都不是子类的高级组件?

是的,这是正确的...假设您正确使用“组件”一词。实际上,作为一般规则,继承不会对组件进行建模。

例如:

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

  public class Cat extends Mammal {
      ....
  }

猫不是哺乳动物的“组成部分”,哺乳动物不是动物的“组成部分”。这不是对“组合”或“容器”关系建模。它正在建立分类关系;即“猫”是“哺乳动物”,“哺乳动物”是“动物”。


你的第一个例子有点令人困惑/困惑,因为类名和方法有相互矛盾的含义(在我看来)。但看起来你正在塑造饮料制造设备。如果这是正确的,那么你真正建模的关系是“is-a”而不是“component-of”/“part-of”。


最后,不要陷入与现实世界相关的类和继承“意味着什么”的问题。实际上,Java类很少用于直接模拟现实世界的东西。 (你不太可能在实际程序中看到模拟猫和咖啡机的类。)继承的真正效用在于它为代码提供结构的能力......而不是它的能力(粗略地模拟现实世界。