Как избежать RTTI в Java - PullRequest
0 голосов
/ 26 марта 2010

Если у меня есть суперкласс, скажем Животное ,

и два подкласса: Зебра и Жираф ,

Если я решу определить Вектор животных:

Vector <Animal> animals = new Vector();

и я хочу сказать: вы можете добавить Жирафы , но вы должны владеть хотя бы одной Зеброй первой.

Каков наилучший способ сделать это без использования RTTI? ( InstanceOf * * тысяча двадцать-одна) * * тысяча двадцать два

1 Ответ

5 голосов
/ 26 марта 2010

Определите свой собственный класс:

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

   ...
}
...