Допустим, у меня есть родительский абстрактный класс дрессировщика животных:
public abstract class Trainer
<A extends Animal,
E extends Enum<E> & Trainables>{
protected EnumSet<E> completed;
public void trainingComplete(E trainable){
trainingComplete.add(trainable);
}
Я хочу, чтобы конкретные расширения родительского дрессировщика животных завершали обучение только для определенных им обучаемых. Итак, если у меня есть конкретный дрессировщик собак следующим образом:
public class DogTrainer extends Trainer<Dog, DogTrainer.Tricks>{
public enum Tricks implements Trainables {
FETCH, GROWL, SIT, HEEL;
}
}
С текущим определением DogTrainer
я могу сделать только trainingComplete
для параметров типа DogTrainer.Tricks
. Но я хочу добиться, чтобы любой, кто создает конкретное Trainer
, разрешал trainingComplete()
использовать Trainables
, которое он определяет внутри себя.
Другими словами, проблема с моим текущим дизайном заключается в том, что если бы у меня был другой тренер, это выглядело бы следующим образом:
public class PoliceDogTrainer extends Trainer<Dog, PoliceDogTrainer.Tricks>{
public enum Tricks implements Trainables {
FIND_DRUGS, FIND_BOMB, FIND_BODY;
}
}
Ничто не мешает кому-то дать определение еще одному дрессировщику румян, который пытается научить собаку полицейским трюкам:
public class RougeTrainer extends Trainer<Dog, PoliceDogTrainer.Tricks>{
...
}
Я хочу запретить это и разрешить расширяющему классу использовать ТОЛЬКО обучаемые, которые они сами указывают.
Как я могу это сделать?