OO - 继承与装饰问题

时间:2010-05-26 18:29:23

标签: oop

我有一个与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;

解决此问题的最佳方法是什么?我没有想出一个不包含大量代码重复的解决方案。

请注意,虽然上面的示例非常小而且简单,但界面和装饰器非常庞大和复杂。

非常感谢。

4 个答案:

答案 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类型而不是接口。瞧,没有代码重复。