#java #oop #polymorphism
#java #ооп #полиморфизм
Вопрос:
Предположим, у меня есть иерархия классов, подобная той, что показана на рисунке. Предположим, мне нужно включить метод, doThis()
который имел бы разную реализацию в классах C
и D
. Но классу B
не обязательно реализовывать этот метод.
Должен ли я объявить контракт в классе A
и предоставить пустую реализацию в классе B
или иметь другой абстрактный класс, X
который расширяется A
и расширяется с помощью C
и D
?
Спасибо
Комментарии:
1. Я с трудом могу разобрать изображение.
2. @Adriaan Раньше это было намного больше. Это просто показывает: A расширяется на B, C и D. B находится слева. A находится на вершине.
3. @Adriaan Koster Даже я не могу этого увидеть. Корпоративный прокси блокирует сайты загрузки изображений, которые вы видите.
4. Теперь я вижу изображение правильно.
Ответ №1:
Не помещайте это в class A
. Используйте interface
, который реализован теми, кому это нужно.
Ответ №2:
Если только подклассы A будут использовать метод:
Создайте другой абстрактный класс, который расширяет A и добавляет метод.
Если вы намерены реализовать этот метод в разных типах классов:
Создайте интерфейс, который объявляет метод, а затем C, D также должны реализовать этот интерфейс.
Комментарии:
1. Добавлено краткое описание, когда использовать каждую опцию.
Ответ №3:
Создайте интерфейс, называемый «выполнимым». позвольте вашим классам C и D реализовать это.
public interface Doable {
public void doThis();
}
public class D implements Doable { /*implementations*/ }
public class C implements Doable { /*implementations*/ }
Ответ №4:
Не помещайте это в A, если вы можете этого избежать.
Из предоставленной вами информации невозможно определить наилучшее решение. Это зависит от контекста и значения классов и методов.