一家公司使用第三方库“ WoodenTableFactory”。它包含2个 final 类TableMaker
和TableWorkshop
,以及一个接口In_TableMaker
,该接口只有一种方法makeTable()
。
目前,表格是使用下面的代码制作的,但有些客户希望在其上刻上自己的名字。
In_TableMaker tableMaker = new TableMaker();
TableWorkshop workshop = new TableWorkshop();
workshop.makeAndDeliverTable (tableMaker);
由于它们是最终类,因此不能用作继承。由于我们不能更改库,只能更改上面的代码,我们如何解决该问题?
答案 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 );