まず、質問のタイトルで申し訳ありませんが、私の問題を説明するのにこれ以上のタイトルは考えられません。お気軽に変更してください:)
Box
いくつかのプライベート変数にいくつかのコンストラクター、メソッド、その他を実装するこの抽象クラスがあるとしましょう。次に、とのようなサブクラスがいくつかBoxA
ありBoxB
ます。これらは両方とも余分なものを実装します。
これで、別の抽象クラスと、およびShape
のようないくつかのサブクラスができました。Square
Circle
両方ともBoxA
、オブジェクトBoxB
のリストが必要ですが、オブジェクトのみがのリストに含まれ、オブジェクトのみがのリストに含まShape
れるようにする必要があります。Square
BoxA
Circle
BoxB
そのリスト(各ボックス)には、get()
andset()
メソッドとaメソッドaddShape()
が必要removeShape()
です。
知っておくべきもう1つの重要なことは、作成された各ボックスについて、またはのいずれBoxA
かBoxB
で、それぞれShape
のリストがまったく同じであることです。Square
の名前付きオブジェクトと名前付きのls
2つのオブジェクトのリストを作成するとします。いずれにせよ、との両方が同じリストを持っている必要があります。BoxA
boxA1
boxA2
boxA1
boxA2
ls
これは私の考えです:
public abstract class Box {
// private instance variables
public Box() {
// constructor stuff
}
// public instance methods
}
public class BoxA extends Box {
// private instance variables
private static List<Shape> list;
public BoxA() {
// constructor stuff
}
// public instance methods
public static List<Square> getList() {
List<Square> aux = new ArrayList<Square>();
for(Square s : list.values()) {
aux.add(s.clone()); // I know what I'm doing with this clone, don't worry about it
}
return aux;
}
public static void setList(List<Square> newList) {
list = new ArrayList<Square>(newList);
}
public static void addShape(Square s) {
list.add(s);
}
public static void removeShape(Square s) {
list.remove(list.indexOf(s));
}
}
リストはそのタイプのオブジェクトで同じである必要があるため、私はそれをとして宣言しstatic
、そのリストで機能するすべてのメソッドもstatic
です。さて、BoxB
クラスはリストのものに関してほとんど同じでしょう。に置き換えるだけSquare
でTriangle
問題は解決しました。BoxA
したがって、作成されたオブジェクトごとに、リストは1つだけで同じになります。作成された各BoxB
オブジェクトについても同じことが起こりますが、もちろん異なるタイプのリストがあります。
それで、あなたが尋ねる私の問題は何ですか?ええと、私はコードが好きではありません...、、、getList()
およびメソッドは基本的setList()
にとに対して繰り返され、リストが保持するオブジェクトのタイプのみが異なります。どういうわけか、これらすべてのメソッドの「重複」を避けたかったのです。addShape()
removeShape()
BoxA
BoxB
Box
代わりにスーパークラスでそれを行う方法を考えることはできません。またはShape
の代わりにを使用して静的に実行しようとしても、リストはすべてのオブジェクトに対して1つだけであり、のサブクラスごとに1つだけである必要があるため、機能しません。Square
Triangle
BoxA
BoxB
Box
どうすればこれを別の方法でより良く行うことができますか?
PS:自分がやっていることに英語で正しい単語がわからないので、実際の例を説明できませんでした。そこで、ボックスと図形の例を使用しましたが、基本的には同じです。