Как внести изменения на выпускных занятиях? - PullRequest
0 голосов
/ 19 июня 2019

Компания использует стороннюю библиотеку «WoodenTableFactory». Он содержит 2 final классов, TableMaker и TableWorkshop, и один интерфейс, In_TableMaker, который имеет только один метод, makeTable().

В данный момент таблицы создаются с кодом ниже, но некоторые клиенты хотят, чтобы их имя было выгравировано на них.

In_TableMaker tableMaker = new TableMaker();
TableWorkshop workshop = new TableWorkshop();
workshop.makeAndDeliverTable (tableMaker);

Поскольку они являются окончательными классами, их нельзя использовать в качестве наследства. Поскольку мы не можем изменить библиотеку, только приведенный выше код, как мы можем решить эту проблему?

Ответы [ 4 ]

4 голосов
/ 19 июня 2019

Разумным подходом было бы реализовать собственный класс, который implements In_TableMake.

Чтобы «минимизировать» свои усилия, вы, вероятно, используете состав вместо наследования.Другими словами, ваш класс, реализующий этот интерфейс, может иметь поле типа TableMaker, которое он использует для внутренней работы.

Также обратите внимание: наследование не следует рассматривать средство, чтобы избежать дублирования кода.Это должно быть видно из перспективы , набирающей .Вы используете модель объектов / классов, чтобы придумать звуковой дизайн, отражающий проблему, которую вы намереваетесь решить!

1 голос
/ 19 июня 2019

Вы можете создать новый класс, который реализует интерфейс In_TableMaker.Этот класс будет иметь необходимые данные и настроенную функцию makeTable().

0 голосов
/ 19 июня 2019

Используйте класс Wrapper.

class TableMakerExtended implements In_TableMaker {
privete final In_TableMaker tableMaker;

public TableMakerExtended(In_TableMaker tableMaker){
    this.tableMaker = tableMaker;
}

@override
public void makeTable(){
    //....
    tableMaker.makeTable();
    //.....
}

}

In_TableMaker tableMaker = new TableMaker(); In_TableMaker
tableMakerExtended = new TableMakerExtended (tableMaker );
TableWorkshop workshop = new TableWorkshop();
workshop.makeAndDelivertable (tableMakerExtended );
0 голосов
/ 19 июня 2019

Как все уже указали, вы должны использовать композицию.Вот пример:

public class MyTableMaker implements In_TableMaker {

   protected TableMaker delegate = new TableMaker();

   // TableMaker methods
   public Object makeTable(Object input) {
       return delegate.method1(input);
   }

   // New methods
   public Object myNewMethod(Object input) {

   }

}

Вам нужно будет заполнить остальные методы, вы можете сделать это автоматически с вашей IDE, например, с Eclipse, вы можете сделать это, нажав CTRL + Shift + S и выбрав«Сгенерировать методы делегата ...»

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