Java设计:多态列表
我有三个班A、B、C A是抽象的,B和C扩展了A 我的目标是让用户能够列出C或B的列表(不要两者都在同一个列表中),我希望通过智能设计强制用户这样做 我的想法是让抽象类具有函数:Java设计:多态列表,java,data-structures,polymorphism,abstract,Java,Data Structures,Polymorphism,Abstract,我有三个班A、B、C A是抽象的,B和C扩展了A 我的目标是让用户能够列出C或B的列表(不要两者都在同一个列表中),我希望通过智能设计强制用户这样做 我的想法是让抽象类具有函数: void add (A a) 和两类: BList扩展了AList,函数void add(B)覆盖了AList的add CList扩展了AList,函数void add(C)覆盖了AList的add 但这不起作用,因为在重写时无法更改函数参数(更具体地说)。如果只想强制执行列表或列表,那么方法就是使用工厂方法:
void add (A a)
和两类:
BList扩展了AList,函数void add(B)覆盖了AList的add
CList扩展了AList,函数void add(C)覆盖了AList的add
但这不起作用,因为在重写时无法更改函数参数(更具体地说)。如果只想强制执行
列表或列表,那么方法就是使用工厂方法:
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>();
}
}
类列表{
private AList(){…}//类外的用户无法调用构造函数
公共静态列表createBList(){
返回新列表();
}
公共静态列表createCList(){
返回新列表();
}
}
这将强制类外的用户使用其中一个工厂方法,工厂方法将只创建B
s或C
s的列表,而不是A
s
也就是说,不清楚你到底想做什么。你无法阻止某人创建ArrayList
并将B
s和C
s都放在其中,而且你也不清楚为什么要重新发明轮子并创建自己的列表类型 虽然我喜欢@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){
...
}
}
公共抽象类{
公开摘要无效添加(TA);
...
}
公共类BList扩展{
@凌驾
公共无效添加(B){
...
}
}
公共类CList扩展了{
@凌驾
公共空间添加(C){
...
}
}
你的意思是不让两者都在同一个列表中吗?你不需要static之后的generic吗?@YassinHajaj不,那就不符合要点了。在静态之后,不能主动使用泛型。您不需要新的类型变量,您需要引用特定的命名类。哦,是的,谢谢。简短的名称让我感到困惑。@LouisWasserman感谢这个想法,我正在编写一个导入程序A、B、C封装用户需要向我提供的其他类B或C的列表,我可以告诉用户给我列表,但我必须手动检查(例如使用instanceof)他没有混合B和C,或者我可以利用你的想法,请用户向我提供列表,这样用户就不会犯错误并混合它们。