2010-03-26 9 views
0

Si j'ai une superclasse, dire animal,Éviter RTTI En Java

et deux sous-classes: Zebra et girafe,

Si je décide de définir un vecteur d'animaux:

Vector <Animal> animals = new Vector(); 

et je veux dire: Vous pouvez ajouter Giraffes, mais vous devez en posséder au moins Zebra d'abord.

Quelle est la meilleure façon de le faire sans utiliser RTTI? (instanceof)

Répondre

5

Définir votre propre classe:

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

Deux points supplémentaires:

  • Il est recommandé de préférer l'utilisation de ArrayList sur Vector.
  • Vous pouvez remplacer la méthode remove() pour vous assurer qu'un Zebra reste toujours dans la collection.

Personnellement, j'irais pour un design qui n'utilise pas l'héritage du tout. Ainsi, au lieu d'un vecteur de sous-classement (ou ArrayList) ma classe déléguera les:

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); } 

    ... 
} 
+0

+1 pour recommander la délégation à la place de l'héritage ainsi que de remarquer que ArrayList est préféré au vecteur. –