Предположим, что у вас есть иерархия классов Java около 30 классов с базовым классом BaseClass и двумя основными подклассами (SubclassA, SubclassB) с несколькими подклассами каждый. Некоторые из этих подклассов имеют определенное поведение. Предположим, вы можете «вытолкнуть» их, изменив свое состояние. (Это новое требование добавление поведения к существующей иерархии. «Poke» не имеет смысла для большинства классов.)Дополнительный интерфейс Java в иерархии классов
interface Pokeable {
void poke();
int getTimesPoked();
}
public class Pokey extends SubclassB
implements Pokeable {
private int timesPoked = 0;
public void poke() {
timesPoked++;
}
public int getTimesPoked() {
return timesPoked;
}
}
Если это будет сделано путем внедрения Pokeable только в тех классах, которые нуждаются в ней, а затем делать во всем коде, который должен вызывать любой объект, который подкачивается?
public void process(BaseClass b) {
if (b instanceof Pokeable) {
((Pokeable)b).poke();
}
}
Или должно быть реализовано всю иерархию. Подкачивается ради немногих, которые действительно являются Pokeable?
interface Pokeable {
void poke();
int getTimesPoked();
boolean isReallyPokeable();
}
public class BaseClass implements Pokeable {
public void poke() {}
public int getTimesPoked() { return 0; }
public boolean isReallyPokeable() { return false;}
}
public class Pokey {
private int timesPoked = 0;
@Override
public void poke() {
timesPoked++;
}
@Override
public int getTimesPoked() {
return timesPoked;
}
@Override
public boolean isReallyPokeable() {
return true;
}
}
public void process(BaseClass b) {
b.poke();
}
Редактировать добавлено: Это своего рода проблема с двойной отправкой. Если код «покер» что-то делает для объекта, он должен вызывать «poke()», если объект «подкачивается», но не может, если нет. Независимо от того, что вы «ткните()» или нет, зависит от того, хочет ли что-то совать и принимает ли объект за то, что он ткнул. Я мог бы использовать шаблон посетителя, но это, похоже, усложняет ситуацию.
Нет ли уровень в иерархии, где вы могли бы решить, если классы сильфонные являются poakable? Как бы то ни было, эти классы должны быть подвержены промывке только для тестирования? – Morfic
К сожалению нет. Большинство подклассов SubclassA Pokeable. Несколько подклассов SubclassB являются Pokeable. Подкласс A и подкласс B очень разные, и Pokeability нельзя учесть без множественного наследования, чего нет у Java. –
В этом случае, возможно, вы могли бы попробовать композицию над наследованием, чтобы отделить «базовые классы poakeable» и «базовые классы, отличные от poakeable». Краткое описание того, как вы собираетесь совать классы, может помочь в разработке более сжатого решения. – Morfic