【问题标题】:Class structure possibly needing implementation of composition to mimic multiple inheritance类结构可能需要实现组合来模拟多重继承
【发布时间】:2012-10-02 16:02:52
【问题描述】:

这是基本前提,我正在为 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
{
        :( :( :(
}

我已经考虑这个问题大约一个月了,如果其中一个对象实现保存的方式发生变化,我想不出一个解决方案不会对对象进行双重维护。在接下来的几天里,我将尝试一些解决方案,并可能会发布我认为在这种情况下最好的解决方案。

【问题讨论】:

    标签: php oop design-patterns multiple-inheritance


    【解决方案1】:

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

    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():
            }
        }
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我猜你的意思是这样说的:

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

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

      【讨论】:

      • 你是对的 ><.>
      猜你喜欢
      • 2019-03-21
      • 2011-04-22
      • 2020-01-22
      • 1970-01-01
      • 2011-01-09
      • 2016-06-10
      • 2011-01-15
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多