Учитывая следующий класс:
class Example implements Interface1, Interface2 {
...
}
Когда я создаю экземпляр класса, используя Interface1
:
Interface1 example = new Example();
... тогда я могу вызывать только методы Interface1
, а не методы Interface2
, если я не приведу:
((Interface2) example).someInterface2Method();
Конечно, чтобы сделать эту среду выполнения безопасной, я должен также обернуть это проверкой instanceof
:
if (example instanceof Interface2) {
((Interface2) example).someInterface2Method();
}
Я знаю, что у меня мог бы быть интерфейс-обертка, который расширяет оба интерфейса, но затем я мог бы получить несколько интерфейсов для обслуживания всех возможных перестановок интерфейсов, которые могут быть реализованы одним и тем же классом. Рассматриваемые интерфейсы естественно не расширяют друг друга, поэтому наследование также кажется неправильным.
Подрывает ли метод instanceof
/cast LSP, когда я опрашиваю экземпляр среды выполнения, чтобы определить его реализации?
Какую бы реализацию я не использовал, у нее, похоже, есть побочный эффект - либо плохой дизайн, либо использование.