我有三个班级A,B,C。
A是抽象的,B和C是A。
我的目标是让用户能够制作C或B的列表(不要将两者放在同一个列表中),我想通过智能设计强制用户这样做。
我的想法是使用函数抽象类AList:
void add (A a)
和两个班级:
BList扩展AList,函数void add(B b)覆盖AList的add。
CList扩展AList,函数void add(C c)覆盖AList的add。
但这不起作用,因为在覆盖时无法更改函数参数(更具体)。
答案 0 :(得分:3)
如果您只想强制执行List<B>
或List<C>
,那么执行此操作的方法就是使用工厂方法:
class AList<T extends A> {
private AList() {...} // users outside the class can't invoke the constructor
public static AList<B> createBList() {
return new AList<B>();
}
public static AList<C> createCList() {
return new AList<C>();
}
}
这会强制您的班级以外的用户使用其中一种工厂方法,而工厂方法只会创建B
或C
s的列表,而不是A
s。
那就是说,目前还不清楚你真正想要做什么。没有什么可以阻止某人创建ArrayList<A>
并将B
和C
放入其中,而且还不清楚为什么要重新发明轮子并创建你的自己的列表类型。
答案 1 :(得分:1)
虽然我喜欢@LouisWassermans解决方案,为什么不简单地使用泛型来解决您的问题?
public abstract class AList<T extends A>{
public abstract void add(T a);
...
}
public class BList extends AList<B>{
@Override
public void add(B b){
...
}
}
public class CList extends AList<C>{
@Override
public void add(C c){
...
}
}