如何在期末课程上进行更改?

时间:2019-06-19 13:54:48

标签: java

一家公司使用第三方库“ WoodenTableFactory”。它包含2个 final TableMakerTableWorkshop,以及一个接口In_TableMaker,该接口只有一种方法makeTable()

目前,表格是使用下面的代码制作的,但有些客户希望在其上刻上自己的名字。

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

由于它们是最终类,因此不能用作继承。由于我们不能更改库,只能更改上面的代码,我们如何解决该问题?

4 个答案:

答案 0 :(得分:4)

合理的方法是实现自己的console.log(settings.name_of_component.url)类。

为了“最小化”您的努力,您可能使用 composition 而不是继承。换句话说,实现该接口的类可能具有类型为implements In_TableMake field ,用于在内部完成其工作。

还请注意:不应将继承力视为避免代码重复的手段。应该从键入角度来看。您经常对对象/类进行建模,以便提出反映您要解决的问题的声音设计!

答案 1 :(得分:1)

您可以创建一个实现接口In_TableMaker的新类。 此类将具有必要的数据和自定义的makeTable()函数。

答案 2 :(得分:0)

正如大家已经指出的那样,您应该使用合成。这是一个示例:

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并选择“生成委托方法...”

答案 3 :(得分:0)

使用包装器类。

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 );