这不是一个特定的已知设计模式,它是一个特别为氧化而制造的功能。 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”。
谢谢,这是一个很好的回答:) –