我使用的复合模式具有可重复使用的元素来构建一个页面。 此我有一个简单的接口,其驱动模式
interface Ai1ec_Renderable {
/**
* This is the main function, it just renders the method for the element,
* taking care of childrens ( if any )
*/
public function render();
}
由于只有一些元素将被允许有孩子,我已经创建了一个抽象类,增加了该行为
abstract class Ai1ec_Can_Have_Children {
/**
*
* @var array
*/
protected $renderables = array();
/**
* Adds a renderable child to the element
*
* @param Ai1ec_Renderable $renderable
*/
public function add_renderable_children( Ai1ec_Renderable $renderable ) {
$this->renderables[] = $renderable;
}
}
因此,如果该对象可以有孩子它扩展了抽象类。 出现这个问题,因为我有HTML元素的第二个抽象类
abstract class Ai1ec_Html_Element {
/**
*
* @var string
*/
protected $id;
/**
*
* @var array
*/
protected $classes = array();
/**
*
* @param $id string
*/
public function set_id( $id ) {
$this->id = $id;
}
public function add_class( $class ) {
$this->classes[] = $class;
}
protected function create_class_markup() {
if (empty( $this->classes )) {
return '';
}
$classes = implode( ' ', $this->classes );
return "class='$classes'";
}
protected function create_attribute_markup(
$attribute_name,
$attribute_value
) {
if (empty( $attribute_value )) {
return '';
}
return "$attribute_name='$attribute_value'";
}
}
问题是,复合材料的所有对象必须实现的接口,其中一些必须扩展只有第一类(can_have_children),而不是第二个(这是因为他们是更高层次的抽象,配置另一个渲染对象做的工作) ,他们中的一些第二,但不是第一个,其中一些两类。
我做了错误的财产以后在设计我的课?我怎么出来的呢? 最明显的方法是使一类重复一些代码
abstract class Ai1ec_Can_Have_Children extends Ai1ec_Html_Element {
/**
*
* @var array
*/
protected $renderables = array();
/**
* Adds a renderable child to the element
*
* @param Ai1ec_Renderable $renderable
*/
public function add_renderable_children( Ai1ec_Renderable $renderable ) {
$this->renderables[] = $renderable;
}
}
这会工作,但它是一个气味的东西是不正确的,因为我需要,如果我添加了一些Can_Have_Children复制代码。 我该怎么办?
PS没有的特质,我支持5.2