2016-06-09 159 views
1

我是Oxid框架的新手,它广泛使用透明父类来扩展基类。我没有看到这种技术的优势。所以我很好奇,这是一种模式吗?好处在哪里?将基类扩展为基类的“普通”扩展的透明父类

干杯, 席

示例代码:

\\ a class by the framework I like to extend 
class A { ... } 

比由框架延伸的这个类的常见方法:

class B extend class B_parent 

凡B_parent是类由框架通过创建一个配置文件,如下所示:

'extend' => array(
     'A' => 'path_to/B') 

回答

2

这不是一个特定的已知设计模式,它是一个特别为氧化而制造的功能。 Oxid中的类不是用“new”来实例化的,而是由工厂来实例化的,例如oxnew(“oxarticle”)。如果没有注册的模块存在于oxarticle中,工厂仅返回一个oxarticle实例。

当模块将“myOxarticle”注册为oxarticle的扩展时,oxnew(“oxarticle”)将返回myOxarticle实例,并且myOxarticle将从oxarticle扩展。这个班级链由工厂建造。这是第一个好处,假设你使用过“myOxarticle extends oxarticle”,你将不得不改变所有使用oxarticle的地方,以便使用你的对象代替oxarticle。现在透明的类链,工厂照顾这一点,你的新功能现在在任何地方使用一个oxarticle对象被使用。叫oxnew(“oxarticle”)的地方不需要知道你的新对象。

第二个好处是当有几个模块扩展相同的Oxid类,甚至是相同的方法。工厂在后台建立一个类链,oxnew(“oxarticle”)返回链中最后一个类的一个实例。如果你扩展一个类,你可以在你所有的方法中调用父方法。因此,如果调用基类的某个方法,则所有模块类的每个方法都会被执行,并且每个模块不需要了解其他模块。

扩展功能的另一种方式是使用挂钩或过滤器。钩子的缺点是它们必须嵌入到每种可能扩展的方法中,即使这样氧化方式也更加灵活。

可能有一些原因阻止您在类方法中调用父方法,例如,如果父方法执行了某些您不希望发生的操作。在这种情况下,这会打破模块之间的独立性,只有在没有其他方式可行的情况下才能完成。

如果你不想改变现有的行为,而是想组成你自己的类只用于你的模块,例如一个新的页面控制器,元数据中有“files”数组,只有寄存器你的类在自动加载器中,在这种情况下,你会使用例如“mycontroller扩展oxubase”而不是“mycontroller扩展mycontroller_parent”。

+0

谢谢,这是一个很好的回答:) –

2

OXID使用这种方式来处理类扩展,因为它可以在不中断继承链的情况下为同一类组合多个扩展。

例如如果两个模块使用class myStart extends startmyOtherStart extends start,它们将只继承start,并且不具有附加功能或从另一个扩展中更改其他功能。所以你不能同时使用两个模块。

通过使用class myStart extends myStart_parentmyOtherStart extends myOtherStart _parent以及metadata.php中的扩展映射,OXID可以将同一类的所有更改动态组合到一个类中。
1)start是父类
2)myStart将在此继承链的末端被施加到start
3)myOtherStart将被应用到myStart
你得到一个单一的类的所有类的扩展

的功能

干杯!

+0

Hey Marat, 感谢您的回复。要清楚: 生成的父类非常重要,在这种情况下,我想用自己的实现替换基类,以及何时通过不同的模块来_inherit_。 有了这个,我可以配置继承,而不是触摸类内的代码。 –