Java设计:多态列表

时间:2016-02-23 21:23:32

标签: java data-structures polymorphism abstract

我有三个班级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。

但这不起作用,因为在覆盖时无法更改函数参数(更具体)。

2 个答案:

答案 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>();
  }
}

这会强制您的班级以外的用户使用其中一种工厂方法,而工厂方法只会创建BC s的列表,而不是A s。

那就是说,目前还不清楚你真正想要做什么。没有什么可以阻止某人创建ArrayList<A>并将BC放入其中,而且还不清楚为什么要重新发明轮子并创建你的自己的列表类型。

答案 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){
    ...
  }
}