Проблема наследования низкоуровневый подход к проектированию

#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, если вы можете этого избежать.

Из предоставленной вами информации невозможно определить наилучшее решение. Это зависит от контекста и значения классов и методов.