拥有简单的超类是否有任何好处,它们只能作为单个变量的存储位置:
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}}个别?
我很难找到何时停止抽象的界限。太多的抽象可能变成一种罪恶,而不是太少。
答案 0 :(得分:0)
我认为只有一个属性的create类没有任何优势。想一想,当你实例化每个类时,你只为一个属性创建了很多进程。在顶层你有一个抽象类作为其他clases的父类,抽象类让你获得部分实现该类的优势,这意味着子类可以使用或不使用其中一些属性。
答案 1 :(得分:0)
一些专门针对您的示例的简单指南:
B
和A
?是C
和A
吗?如果是,那么至少让基数A
有意义。如果没有,那么这对你来说都没有意义。如果是前者:A
都有Config
吗?也就是说,Config
每个A
的某些内在属性是否与任何子类无关?如果是这样,那么在基类中拥有该成员是有意义的。如果没有,那么将成员保留在子类中(或者例如具有A
- > ConfigurableA
- > B
/ C
/等。如果这样做更有意义你。)这是一个可能对第二点有帮助的练习:Bird
是Creature
。 Cat
是Creature
。 Parrot
和Robin
是Bird
。 1)你如何在这里组织班级层次? 2)你会把wingspan
财产放在哪里? 3)你会在哪里放一个weight
财产? 4)你会在哪里列出wordsSpokenByParrot
?
您的目标是让您的工作现在和将来都更轻松。如果您的代码使您的工作更加努力,那么您就不应该这样做。它非常简单。
更一般地说:无论你正在做什么项目,做某事会让你的代码更简单或更复杂吗?是否更容易或更难更改可能会更改的功能?你会记得它在6个月内如何运作吗?记录它的时间是否超过了节省编码的时间?什么是B和C之间的区别,你是否关心这种差异是什么(语义差异确实有用,顺便说一下!)?列出你的利弊,选择(取决于应用程序)将变得清晰。
如果超类非常简单并且只包含一个变量,那么值得转向合成吗?
我不知道,你告诉我们。只有你知道你正在编写的程序最有意义的是什么,这可能与你编写的下一个程序有所不同。它并不是要遵守一些严格而快速的规则,而是关于你在完成工作时让自己轻松生活。