接口是否通过代码复制解决DDD?

时间:2009-11-05 11:11:49

标签: java php c++ interface

AccountController无法同时扩展BaseAccount和BaseController。如果我将所有BaseAccount或BaseController方法都清空,我可以有一个接口,但是如果我在两个不同的地方实现该接口,也就是说,我在两个不同的地方签订合同来实现一个方法,我会有重复的代码。接口是否通过代码复制来解决DDD?

interface A {
    function doStuff() {
    }
}

class B implements A {
    function doStuff() {
        // a code
    }
}

class C implements A {
    function doStuff() {
        // the same code!!!
    }
}

2 个答案:

答案 0 :(得分:2)

接口解决了DDD问题,因为DDD问题与实现的模糊性有关。接口不包含实现,因此如果从单个类和多个接口继承,则无法获得这种歧义。

在您描述的情况下,如果BaseController和BaseAccount中的方法具有相同的签名,则可以获取DDD。如果你只从其中一个继承你就无法解决这个问题。

也许您可以重新考虑为什么要创建帐户和控制器。听起来有点像你让一堂课做得太多了。

顺便说一句,我建议使用像“Controller”这样的名称而不是“BaseController”,因为当你做这样的事情时它会更自然:

Controller con = ControllerFactory.Create();

而不是

BaseController con = ControllerFactory.Create();

在此示例中,“con”不一定是BaseController。它可以是任何Controller子类。

答案 1 :(得分:1)

对你的上一次发送有点困惑,但是如果你想要多重继承那么你需要这样做:

AccountController扩展BaseAccount,BaseAccount扩展BaseController

BaseController
  |
BaseAccount
  |
AccountController

使用此方法可以使用$ this从AccountController访问BaseAccount和BaseController的所有成员函数。