首先,我很抱歉这个问题的标题,但我想不出一个更好的来描述我的问题。随意更改它:)
假设我有这个抽象类Box
,它在一些私有变量上实现了几个构造函数、方法和任何东西。然后我有几个子类,比如BoxA
and BoxB
。这两个都实现了额外的东西。
现在我有了另一个抽象类Shape
和一些子类,比如Square
and Circle
。
对于两者BoxA
,BoxB
我需要有一个Shape
对象列表,但我需要确保只有Square
对象进入BoxA
' 列表,并且只有Circle
对象进入BoxB
' 列表。
对于该列表(在每个框上),我需要一个get()
andset()
方法以及一个addShape()
andremoveShape()
方法。
要知道的另一件重要的事情是,对于每个创建的框,无论是BoxA
还是BoxB
,每个Shape
列表都是完全相同的。假设我创建了一个名为 的列表Square
和ls
两个名为and的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
对象,列表将只有一个且相同。每个BoxB
创建的对象都会发生同样的情况,但当然是使用不同类型的列表。
那么,你问我的问题是什么?好吧,我不喜欢代码... getList()
,setList()
,addShape()
和removeShape()
方法基本上是重复的BoxA
和BoxB
,只是列表将包含的对象的类型不同。我想以某种方式避免所有这些方法“重复”。
我想不出在超类中做这件事的方法Box
。尝试静态地执行它,使用Shape
而不是Square
or Triangle
,将不起作用,因为列表对于所有对象BoxA
和BoxB
对象来说只有一个,我需要它只是一个,但对于Box
.
我怎样才能以不同的方式更好地做到这一点?
PS:我无法描述我的真实例子,因为我不知道我正在做的事情的正确英文单词,所以我只是使用了一个盒子和形状的例子,但它基本上是一样的。