我有一个与OOP相关的问题。我有一个界面,说:
class MyInterface {
public int getValue();
}
在我的项目中,此接口由7个实现实现:
class MyImplementation1 implements MyInterface { ... }
...
class MyImplementation7 implements MyInterface { ... }
这些实现由几个不同的模块使用。对于某些模块,必须稍微调整MyInterface的行为。我们必须返回执行器+ 1的值(为了示例)。我通过创建一个小装饰器来解决这个问题:
class MyDifferentInterface implements MyInterface {
private MyInterface i;
public MyDifferentInterface(MyInterface i) {
this.i = i;
}
public int getValue() {
return i.getValue() + 1;
}
}
这样做了。
这是我的问题:其中一个模块不接受MyInterface参数,而是直接接受MyImplementation4。原因是此模块需要MyImplementation4的特定行为,MyInterface接口本身并未涵盖这些行为。但是,这就困难了,这个模块也必须适用于MyImplementation4的修改版本。也就是说,getValue()必须返回+1;
解决此问题的最佳方法是什么?我没有想出一个不包含大量代码重复的解决方案。
请注意,虽然上面的示例非常小而且简单,但界面和装饰器非常庞大和复杂。
非常感谢。
答案 0 :(得分:2)
如果是Java,你可以
class ModifiedMyImplementation4 extends MyImplementation4
{
@Override
public int getValue()
{
return super.getValue() + 1;
}
}
没有代码重复!
答案 1 :(得分:0)
使用getValue
中的virtual
关键字声明MyImplementation4
。
从MyImplementation4
继承新类,并使用override
关键字声明getValue
函数并将其实现为return base.getValue()+1
。
答案 2 :(得分:0)
您可以尝试以下方式:
public class MyDifferentImplementation4 extends MyImplementation4 {
private MyDifferentInterface mdi;
public MyDifferentImplementation4(MyDifferentInterface mdi) {
this.mdi = mdi;
}
public getValue() {
return mdi.getValue();
}
}
传递给构造函数的MyDifferentInterface实例应该包装一个MyImplementation4实例(您可以通过使用MyDifferentInterface的子类来强制执行该实例,其构造函数采用MyImplementation4的实例而不是接口)。
答案 3 :(得分:0)
这个解决方案意味着我必须这样做 复制所有这些代码
难道你不能把重复的代码放到抽象类MyAbstractImplementation
中吗?然后这两个子类可以从抽象类继承。它需要的只是一个抽象的方法,它甚至不需要做任何事情,它只需要由孩子们实现。
void foo(void);
需要不同行为的孩子会覆盖该方法。消费者需要接受MyAbstractImplementation
类型而不是接口。瞧,没有代码重复。