类结构可能需要实现组合来模仿多重继承

时间:2012-10-11 21:36:07

标签: php oop design-patterns multiple-inheritance

这是基本前提,我正在使用db对象的活动记录模式,我认为我需要一些指导如何组织这些类。而且一般来说我怎么可能分裂我的班级结构。希望我不会解释这个太过分了。如果构图模式是要走的路,我可能需要一点手握住实现它的方法。

假设有ActiveRecord基类,位于图腾柱的底部,用于处理将对象映射到数据库,将数据库映射到对象。

ActiveRecord的子类是一种通用的User类,用于处理用户会话,登录,保存时密码字段的加密等。

ActiveRecord的另一个孩子是ActiveRecordButSlightlyMoreAdvanced班。通常这个类与User无关,但这是我的问题。

我希望有一个子类,它基本上是UserActiveRecordButSlightlyMoreAdvanced的组合; UserButSlightlyMoreAdvanced,无需复制粘贴User中的所有方法。 User扩展ActiveRecordButSlightlyMoreAdvanced没有意义,因为它需要基本上覆盖一堆对User有不良行为的方法。 UserButSlightlyMoreAdvanced扩展ActiveRecordButSlightlyMoreAdvanced是有意义的,但我必须从User复制并粘贴一堆方法。

我知道有些人会对图片有更好的认识,所以这是图示的结构。

class ActiveRecord
{
    ....
}

孩子

class User extends ActiveRecord
{
    ....
}

也是孩子

class ActiveRecordButSlightlyMoreAdvanced extends ActiveRecord
{
    ....
}

问题

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced
{
        :( :( :(
}

我一直在考虑这个问题大约一个月了,如果有人改变其中一个实现保存的方式,就不会想到一个不会给维护对象带来负担的解决方案。我将在接下来的几天内尝试一些解决方案,并可能发布我认为在这种情况下最好的解决方案。

2 个答案:

答案 0 :(得分:1)

我的猜测是你想说的:

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced 
{
    :) :) :)
}

如果是这种情况,请查看特征http://php.net/manual/en/language.oop5.traits.php

答案 1 :(得分:0)

您可以尝试使用策略模式。在这种情况下,您将创建您的类:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
    private $_strategy;

    public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
        $this->_strategy = $s;
    }
}

制作策略课程:

interface ActiveRecordButSlightlyMoreAdvancedStrategy
{
        // Define what this should do here
}

创建一个实现上述接口的策略类。

class ActiveRecordButSlightlyMoreAdvanced implements ActiveRecordButSlightlyMoreAdvancedStrategry {
    // Do stuff here
}

现在,当您调用这些高级方法时,两个类都实现相同的接口,但UserButSlightlyMoreAdvanced类只是将请求传递给策略对象:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
    {
        private $_strategy;

        public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
            $this->_strategy = $s;
        }

        public function someSlightlyMoreAdvancedFunction () {
             return $this->_strategy->someSlightlyMoreAdvancedFunction():
        }
    }

希望有所帮助。