Java 设计:多态列表
Java Design : Polymorphic List
我有三个 classes A,B,C。
A是抽象的,B和C扩展了A。
我的目标是让用户能够制作 C 或 B 的列表(不要将两者都放在同一个列表中),我想通过智能设计强制用户这样做。
我的想法是抽象 class AList 函数:
void add (A a)
和两个 classes:
BList 扩展 AList,函数 void add (B b) 覆盖 AList 的 add。
CList 扩展 AList,函数 void add (C c) 覆盖 AList 的 add。
但这没有用,因为在覆盖时您不能更改函数参数(更具体地说)。
如果您只想强制执行 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>();
}
}
这会强制 class 以外的用户使用其中一种工厂方法,并且工厂方法只会创建 B
或 C
的列表,而不是 A
s.
就是说,目前还不清楚您真正想要做什么。你无法阻止某人创建 ArrayList<A>
并将 B
和 C
都放入其中,而且还不清楚你为什么要重新发明轮子并创建你的自己的列表类型。
虽然我喜欢@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){
...
}
}
我有三个 classes A,B,C。
A是抽象的,B和C扩展了A。
我的目标是让用户能够制作 C 或 B 的列表(不要将两者都放在同一个列表中),我想通过智能设计强制用户这样做。
我的想法是抽象 class AList 函数:
void add (A a)
和两个 classes:
BList 扩展 AList,函数 void add (B b) 覆盖 AList 的 add。
CList 扩展 AList,函数 void add (C c) 覆盖 AList 的 add。
但这没有用,因为在覆盖时您不能更改函数参数(更具体地说)。
如果您只想强制执行 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>();
}
}
这会强制 class 以外的用户使用其中一种工厂方法,并且工厂方法只会创建 B
或 C
的列表,而不是 A
s.
就是说,目前还不清楚您真正想要做什么。你无法阻止某人创建 ArrayList<A>
并将 B
和 C
都放入其中,而且还不清楚你为什么要重新发明轮子并创建你的自己的列表类型。
虽然我喜欢@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){
...
}
}