Java - 我有一个抽象基类,我想从子类中设置一些基类属性。最好的方法是什么?使属性受到保护?在基类中创建setter?
public abstract class A {
protected String tag;
protected String apiUrl;
// Setter
public void setApiUri(String url) {
this.apiUrl = url;
}
}
public class B extends A {
tag = "Class B";
apiUrl = "Class B Prefs";
}
public class C extends A {
tag = "Class C";
apiUrl = "Class C Prefs";
}
请告诉我什么是最好的方法/更好的方法。
答案 0 :(得分:3)
如果要进行最大封装,请将基类字段设为私有,并提供受保护的访问者。这通常是最好的做法。
如果你对最大封装没有太多的困扰,你可以使字段受到保护,但它将这些类耦合得比继承本身(呃)本质上更紧密。
一般来说,最好的选择是上面的第一个选项。 JVM的JIT可以优化调用,它有助于保持某些松散耦合。
答案 1 :(得分:0)
这取决于具体情况,但通常您希望保留派生类的基类状态,并完全控制它如何实例化自己的成员。实现此目的的最佳方法是为基类指定一个构造函数,该构造函数输入并初始化其成员并使用具体类调用它。这是一个例子:
abstract class Base{
String s;
int i;
public Base(String s, int i){
this.s = s; // Only base knows best how the initialization should be done
this.i = i;
}
}
class Concrete extends Base{
// the role of the inheritor is to pass on the building blocks of its Base to Bases
//constructor
public Concrete(String s, int i) {
super(s, i);
}
}