如果超类非常简单并且只包含一个变量,那么值得转向合成吗?

时间:2017-07-15 00:52:28

标签: java oop

拥有简单的超类是否有任何好处,它们只能作为单个变量的存储位置:

public abstract class A {
    private Config value;

    public A(Config value) {
        this.value = value;
    }

    protected Config getValue() {
        return this.value;
    }
}

public class B extends A {
    public B(Config value) {
        super(value);
    }
}

public class C extends A {
    public C(Config value) {
        super(value);
    }
}

与没有超类和组合相反:

public class B {
    private Config value;

    public B(Config value) {
        this.value = value;
    }
}

public class C {
    private Config value;

    public C(Config value) {
        this.value = value;
    }
}

对于包含整数的每个类来说,扩展一个专门用于保存整数的类是没有意义的(如超类示例中所示),所以肯定没有超类只使用每个{ {1}}个别?

我很难找到何时停止抽象的界限。太多的抽象可能变成一种罪恶,而不是太少。

2 个答案:

答案 0 :(得分:0)

我认为只有一个属性的create类没有任何优势。想一想,当你实例化每个类时,你只为一个属性创建了很多进程。在顶层你有一个抽象类作为其他clases的父类,抽象类让你获得部分实现该类的优势,这意味着子类可以使用或不使用其中一些属性。

答案 1 :(得分:0)

一些专门针对您的示例的简单指南:

  1. 从语义上讲,是BA?是CA吗?如果是,那么至少让基数A有意义。如果没有,那么这对你来说都没有意义。如果是前者:
  2. 所有A都有Config吗?也就是说,Config每个A的某些内在属性是否与任何子类无关?如果是这样,那么在基类中拥有该成员是有意义的。如果没有,那么将成员保留在子类中(或者例如具有A - > ConfigurableA - > B / C /等。如果这样做更有意义你。)
  3. 这是一个可能对第二点有帮助的练习:BirdCreatureCatCreatureParrotRobinBird。 1)你如何在这里组织班级层次? 2)你会把wingspan财产放在哪里? 3)你会在哪里放一个weight财产? 4)你会在哪里列出wordsSpokenByParrot

    您的目标是让您的工作现在和将来都更轻松。如果您的代码使您的工作更加努力,那么您就不应该这样做。它非常简单。

    更一般地说:无论你正在做什么项目,做某事会让你的代码更简单或更复杂吗?是否更容易或更难更改可能会更改的功能?你会记得它在6个月内如何运作吗?记录它的时间是否超过了节省编码的时间?什么是B和C之间的区别,你是否关心这种差异是什么(语义差异确实有用,顺便说一下!)?列出你的利弊,选择(取决于应用程序)将变得清晰。

      

    如果超类非常简单并且只包含一个变量,那么值得转向合成吗?

    我不知道,你告诉我们。只有你知道你正在编写的程序最有意义的是什么,这可能与你编写的下一个程序有所不同。它并不是要遵守一些严格而快速的规则,而是关于你在完成工作时让自己轻松生活。