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')
4

2 回答 2

2

OXID 使用这种处理类扩展的方式,因为它可以为同一个类组合多个扩展而不破坏继承链。

例如,如果两个模块都使用and ,那么您有两个扩展相同类“ start”的模块(对于商店开始页面),它们将仅从另一个扩展继承而不具有附加功能或更改。所以你不能同时使用这两个模块。class myStart extends startmyOtherStart extends startstart

通过使用class myStart extends myStart_parentmyOtherStart extends myOtherStart _parent与 metadata.php 中的扩展映射一起使用,OXID 可以动态地将同一类的所有更改合并到一个类中。
1)start是父类
2)myStart将应用于start
3)myOtherStart将应用于myStart
此继承链的末尾,您将获得一个具有所有类扩展功能的类

干杯!

于 2016-06-09T08:11:37.097 回答
2

这不是一个特定的已知设计模式,它是专门为 oxid 设计的功能。Oxid 中的类不是用“new”而是由工厂实例化的,例如 oxnew("oxarticle")。如果 oxarticle 没有注册的模块,工厂只返回一个 oxarticle 的实例。

当一个模块将“myOxarticle”注册为 oxarticle 的扩展时,oxnew("oxarticle") 将返回一个 myOxarticle 实例,而 myOxarticle 将从 oxarticle 扩展而来。这个类链是工厂搭建的。这是第一个好处,假设您使用了“myOxarticle extends oxarticle”,您将不得不更改所有使用 oxarticle 的地方,以便使用您的对象而不是 oxarticle。现在有了透明的类链,工厂处理了这个,你的新功能现在可以在任何使用 oxarticle 对象的地方使用。调用 oxnew("oxarticle") 的地方不需要知道你的新对象。

第二个优点是当有多个模块扩展同一个 Oxid 类,甚至是同一个方法时。工厂在后台构建类链,oxnew("oxarticle") 返回链中最后一个类的实例。如果扩展一个类,则在所有方法中调用父方法是一种很好的做法。因此,如果调用基类的某个方法,则所有模块类的每个方法都会被执行,并且每个模块都不需要知道其他模块。

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

可能有一些原因会阻止您在类方法中调用父方法,例如,如果父方法做了您不希望发生的事情。在这种情况下,这破坏了模块之间的独立性,并且只有在没有其他方法的情况下才应该这样做。

如果您不想更改现有行为,而是想创建自己的仅由模块使用的类,例如新的页面控制器,则元数据中有“文件”数组,它只在自动加载器,在这种情况下,您将使用例如“mycontroller extends oxubase”而不是“mycontroller extends mycontroller_parent”。

于 2016-06-09T14:38:44.260 回答