Является ли приведенный ниже шаблон множественного наследования Java, если да, то какой? - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю в приложении Swing более 8 лет, но оно было разработано, возможно, 20 лет назад, дизайнеры создали свои собственные компоненты (я думаю, что изначально с использованием AWT, но на каком-то этапе оно было обновлено до Swing).

Существует виджет, используемый на нескольких экранах, который представляет данные в стиле диаграммы Ганта, который позволяет взаимодействовать с пользователем, перетаскивать и оставлять его среди прочего.Упрощенное описание этого дизайна приведено ниже:

//Many lines of implementation code and only 1 constructor
public class GanttChartImplementation extends JPanel {

  public GanttChartImplementation(String p1, Object p2, boolean p3, boolean p4){
    //Implementation code
  }

}


//No implementation only constructors
public class GanttChartInterface extends GanttChartImplementation {

  public GanttChartInterface(String p1, Object p2, boolean p3, boolean p4) {
    super(p1,p2,p3,p4);
  }

  public GanttChartInterface(String p1, Object p2, boolean p3) {
    super(p1,p2,p3,true); //defaults p4 to true as it's not passed in
  }

  public GanttChartInterface(String p1, Object p2) {
    super(p1,p2,true,true); //defaults p3, p4 to true as these are not passed in
  }
}

Все экраны в приложении будут расширять GanttChartInterface, первое его очевидное использование - скрыть класс реализации от экранов, использующих виджет Диаграмма Ганта.Даже в теории GanttChartInterface может быть изменен для расширения другого класса реализации без необходимости менять экраны, которые используют виджет Диаграмма Ганта.

Еще одно преимущество этого дизайна, которое я обнаружил на протяжении многих лет, заключается в том, что при добавлении нового параметра в конструктор в классе GanttChartImplementation экраны, использующие виджет, изменять не нужно, поскольку они требуются толькоизменить существующие конструкторы в GanttChartInterface, чтобы они установили новое значение параметра по умолчанию, а затем создадут новый конструктор, например, как показано ниже:

//Add new parameter to constructor used to have 4 now 5
public class GanttChartImplementation extends JPanel {

   public GanttChartImplementation(String p1, Object p2, boolean p3, boolean p4, boolean p5){
     //Implementation code
   }

}

Нужно только изменить GanttChartInterface, чтобы он компилировался, и нетМне нужно изменить любой из уже существующих экранов, использующих виджет:

//No implementation only constructors had 3 constructors now has 4
public class GanttChartInterface extends GanttChartImplementation {

  //Create new constructor that receives the new parameter
  public GanttChartInterface(String p1, Object p2, boolean p3, boolean p4, boolean p5) {
    super(p1,p2,p3,p4,p5); 
  }

  public GanttChartInterface(String p1, Object p2, boolean p3, boolean p4) {
    super(p1,p2,p3,p4,true); //defaults p5 to true as it's not passed in
  }

  public GanttChartInterface(String p1, Object p2, boolean p3) {
     super(p1,p2,p3,true,true); //defaults p4, p5 to true as these are not passed in
  }

  public GanttChartInterface(String p1, Object p2) {
     super(p1,p2,true,true,true); //defaults p3, p4, p5 to true as these are not passed in
  }
}

Я просмотрел множество статей в Интернете и ТАК вопросы, и это не похоже на шаблон проектирования GoF и убежище 'где-нибудь найти, если это широко распространенный шаблон дизайна или нет?Я пытаюсь найти информацию, поскольку я хотел бы знать, кто придумал этот дизайн.Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 19 февраля 2019

В ООП это перегруженный конструктор для предоставления значений по умолчанию.

РЕДАКТИРОВАТЬ Как @boris, упомянутый в комментариях.Вам не нужно использовать подкласс для перегрузки метода, вы можете просто сделать это в GanttChartImplementation.Нет выгоды от наследования здесь.Просто ненужный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...