J’ai trois classes (le nombre augmentera probablement dans le futur):
public inteface Base{ } public class Select implements Base{ } public class Ast implements Base{ } public class Gt implements Base{ }
J’ai aussi besoin d’un cours de List
BaseList extends ArrayList{ public boolean add(Base b){ throw new UnsupportedOperationException("You should use add%ConcereteBaseType% method instead"); } public boolean add(Select s){ } public boolean add(Ast a){ } public boolean add(Gt g){ } }
La raison pour laquelle j’ai fait cela est le fait que je ne veux pas que quiconque ajoute des éléments via un pointeur sur Base
. Dans ma situation concrète, cela serait dangereux.
Mais l’inconvénient est qu’il ne sera découvert qu’au moment de l’exécution.
J’ai aussi besoin de parcourir la liste.
Est-ce une bonne pratique de faire de telles choses?
Utiliser une interface
c’est bien. (Faire de la Base
une classe abstraite ne vous rapportera rien ici.)
Cependant, vous devriez préférer la composition à l’inheritance et implémenter Iterable
pour pouvoir l’utiliser dans les boucles for for améliorées, etc.
class BaseList implements Iterable { private List list = new ArrayList<>(); public boolean add(Select s) { return list.add(s); } public boolean add(Ast a) { return list.add(a); } public boolean add(Gt gt) { return list.add(gt); } @Override public Iterator iterator() { return Collections.unmodifiableList(list).iterator(); } }
Vous pouvez ensuite parcourir la liste comme suit:
for (Base b : yourBaseList) { ... }
Vous pourriez faire de Base
une classe abstract
, car celles-ci ne pourraient jamais être instanciées, votre liste serait en sécurité.
Mon chemin: je ne comprends vraiment pas pourquoi vous voudriez lancer une exception pour add(Base b)
lorsque base est une interface
qui elle-même ne peut jamais être un object.
Sinon, utilisez le modèle delegate / wrapper, ce qui signifie: Ne pas étendre ArrayList
, mais créer une classe contenant un ArrayList.
class BaseList { private List list = new ArrayList<>(); public boolean add(Select s) { return list.add(s); } //etc }