Доступ к подклассу из интерфейса - PullRequest
0 голосов
/ 29 мая 2020

У меня есть массив интерфейса с именем Component. Существует еще один класс с именем Frame, который расширяет компонент следующим образом: Component (интерфейс)> AbstractComponent (абстрактный класс)> AbstractContainer (абстрактный класс)> OrganizedContainer (класс)> Frame (класс)

Все в массиве компонентов идет в рендерер для рендеринга. Я хочу иметь доступ к методам объекта Frame из класса AbstractContainer. Возможно ли это без объявления метода в интерфейсе компонентов?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Класс реализует интерфейс. Класс расширяет другой класс. Интерфейс расширяет другой интерфейс. Это соглашение в java, и я упомянул, что в вашем вопросе вы сказали, что ваш класс расширяет интерфейс Component.

Frame<<concrete class>> extends OrganizedContainer extends AbstractContainer extends AbstractComponent implements Component<<interface>>

Теперь переходим к вашему вопросу. Возможно ли из класса AbstractContainer получить доступ к методу, который определен только в Frame? Да, это возможно. Как ? В родительском элементе просто введите тип (Frame)this.methodInFrame() и, чтобы избежать того, чтобы какой-либо другой объект подкласса в настоящее время упоминается this, вам необходимо использовать оператор instanceof. так что это вроде

 if(this instanceof Frame){
     (Frame)this.methodInFrame();
 }

Это хорошая практика? Вовсе нет, суперкласс не должен зависеть от своих подклассов. Это увеличивает взаимосвязь в вашей программе и приводит к проблемам с обслуживанием. Что, если у вас есть или планируете иметь или можете иметь в будущем еще какие-то конкретные подклассы? Когда вы изменяете Frame, ваши суперклассы должны быть изменены, и по этой причине ваши вновь добавленные подклассы могут нуждаться в модификации. Также это приводит к проблемам, которые могут быть проблемами во время выполнения. когда вы используете instanceof, обратите внимание, что это запах кода, у вас должна быть очень веская причина для его использования.

1 голос
/ 29 мая 2020

Единственный способ сделать это - проверить, относится ли компонент к типу Frame с component instanceof Frame, а затем привести компонент к Frame.

...