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



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

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

我猜你是想这么说的:

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

如果是这样的话,研究一下特征http://php.net/manual/en/language.oop5.traits.php

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

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

希望能有所帮助。

最新更新