クラス階層を設計したい。スーパークラスには抽象メソッドがあり、サブクラスはこのメソッドをオーバーライドする必要がありますが、私の問題は、このメソッドがスーパークラス (インスタンス変数) のデータを使用することです。
この問題を解決するために、いくつかのスタイルを設計しました。
スタイル 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...
}
}
スタイル 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...
}
}
スタイル 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...
}
}
それらのどれがより良いですか?または、私の問題をよりよく解決するための解決策が他にありますか?