在Java中避免RTTI

时间:2010-03-26 06:29:14

标签: java oop rtti

如果我有超类,请说动物

和两个子类: Zebra Giraffe

如果我决定定义动物矢量:

Vector <Animal> animals = new Vector();

我想说:你可以添加 Giraffes ,但你必须先拥有至少一个 Zebra

不使用RTTI,最好的方法是什么? (的instanceof

1 个答案:

答案 0 :(得分:5)

定义自己的类:

class Animals extends Vector<Animal>
{
   public Animals(Zebra z) { add(z); }
}

还有两点:

  • 建议更喜欢使用ArrayList而不是Vector。
  • 您可能希望覆盖remove()方法以确保Zebra始终保留在集合中。

就个人而言,我会选择一种根本不使用继承的设计。因此,我的类将委托给它们而不是子类化vector(或ArrayList):

class Animals extends 
{
   private final Vector<Animal> inner = new Vector<Animal>();

   public Animals(Zebra z) { add(z); }

   // Delegate to whatever methods of Vector that Animals need to support, e.g.,
   void add(Animal a) { inner.add(a); }

   ...
}