我想设计类层次结构.超类有一个抽象方法,子类必须重写这个方法,但我的问题是:这个方法使用超类(实例变量)的数据.
我设计了一些样式来解决这个问题:
样式1:使用私有实例变量并在子类中创建其他实例变量
class SuperClass {
private T data;
public SuperClass(T data) { /* ... */}
public abstract void doSomething();
}
class SubClass extends SuperClass {
private T data; // use another variable
public SubClass(T data) {
super(data);
this.data = data;
}
public void doSomething() {
// use 'data'
int length = data.getLength(); // for example...
}
}
Run Code Online (Sandbox Code Playgroud)
样式2:使用受保护的实例变量:
class SuperClass {
protected T data;
public SuperClass(T data) { /* ... */}
public abstract void doSomething();
}
class SubClass extends SuperClass {
public void doSomething() {
// use 'data'
int length = data.getLength(); // for example...
}
}
Run Code Online (Sandbox Code Playgroud)
样式3:使用私有实例变量和受保护的方法:
class SuperClass {
private T data;
public SuperClass(T data) { /* ... */}
public abstract void doSomething();
protected T getData() {
return data;
}
}
class SubClass extends SuperClass {
public void doSomething() {
// use 'data'
int length = getData.getLength(); // for example...
}
}
Run Code Online (Sandbox Code Playgroud)
哪个更好?或者有更多解决方案来更好地解决我的问题?
第三种方法通常是首选方法,如果您设计公共子类,则必须使用.超类希望尽可能多地控制其内部.
另一方面,如果您正在开发一个全部位于同一个包中的封闭层次结构,或者至少在同一个项目中,则可以选择将var公开为protected,如果有任何好处的话.
但是,复制子类中的私有var是所有计数的失败.我想不出任何可以帮助任何事情的场景.