我有一个场景,我有几个类从一个共同的祖先延伸出来,因为它们都共享共同的属性和方法。这些类中的一半(组A)包含一个不由另一半(组B)共享的属性,因此组A中的每个类显式声明此属性而不是父类。具有不合作类级别的多态性
例如
class parent
{
}
class child1 <and child2, and child3> extends parent
{
protected $specialProperty;
}
class child4 <and child5, and child5> extends parent
{
// no "$specialProperty"
}
我有一些行为需要在$specialProperty
上实施该行为。当然,我想把它放在父类中,只做一次,但$specialProperty
并不存在于所有的子类中。
一种选择是创建声明$specialProperty
并实现所需的行为中间,抽象类,但我不愿意这样做有几个原因:
- 此方案将是即将到来更快。那我该怎么做?为每个功能创建5或6个不同的中间人抽象类?
- 该类的层次结构已经比
parent
高5层左右。我是否真的应该创造越来越多的层面来弥补那些构思不够理想的阶级层次结构,而这种层次结构是以有限的需求来构思的? - 至少就PHP而言,不会有那么多的继承层最终导致性能问题?
另一种方法是做到以下几点:
class parent
{
public function functionThatTheAppWillCallAutomatically()
{
if (property_exists($this, 'specialProperty'))
{
// do stuff with specialProperty
}
}
}
的“东西”会由有$specialProperty
和跳过那些不子类得到执行。我讨厌这个解决方案,虽然因为它只是对我来说似乎是错误和马虎。在我看来,家长不应该根据孩子的特性决定做什么(哎呀,它可能不应该知道孩子存在 - 这不是孩子班级的原因?)
总之,我不确定这两个选项中哪一个最不好,或者是否有更好的可能性。我急于等待建议。
谢谢!
编辑:
最后我做了以下实施这一特殊的功能。
class archivalDecorator extends decoratorBase /* decoratorBase just has constructor and the object property */
{
public function archive()
{
if (!$this->object->archive())
{
return false;
}
if (property_exists($this->object, 'specialProperty'))
{
// do extra stuff here that involves "specialProperty"
}
return true;
}
}
这样,我所有的对象执行相同的档案工作流程,但需要特殊行为的类仍然可以执行它没有我需要实现在这些特殊情况的层级数十个子类。
尽管我仍然使用property_exists(...)
来确定是否需要特殊行为,但我认为现在可以,因为我没有在父类中做这件事。$specialProperty
是一个公共属性,所以没有理由让外部类不应该知道它,但是对于使用$this
在子类中检查该属性的父类感觉错误。
我希望我没有误用这个概念。
如果我使用装饰器,我仍然需要应用装饰器的代码来检查对象是否需要装饰。也就是说,如果它具有“$ specialProperty”,那么我需要应用装饰器并调用专门的方法,否则我会正常进行。 所以,我在技术上仍然需要有一些逻辑来研究子类,但是这里的区别是我在外部而不是从父类进行。 我想这是什么使它在结构上听起来很健康。它是否正确? –
这不是装饰模式的工作原理。如果你走了这条路线,你会重做你的整个班级树。 –
@Peter Bailey:你能更具体地说我错了吗?我应该用调用decorator来替换对“functionThatTheAppWillCallAutomatically()”的调用(仅当“$ specialProperty”存在时),并让修饰器根据是否声明“$ specialProperty”决定如何执行操作在对象中?或者我完全离开这里? –