我的类为框架提供的迭代器提供了额外的功能,同时从用户隐藏了迭代器。所以我想在大多数任务中使用delegation。
我的类只需要在当前元素上运行,所以我想我真正需要的是在框架提供的迭代器中执行特定于迭代器的函数我保留在私有字段中?或者我错过了什么?
所有其他方法都在当前元素上运行或者无论如何都是独立的。
答案 0 :(得分:0)
(我不是这方面的专家,但我很悲伤地看到问题,像这样的答案。希望别人总有一天会一步更好的东西。)
最简单的方法似乎是从ArrayObject继承。
或者,可以定义一个抽象基类,通过委托传递给其构造函数的另一个iterable来实现Iterator方法(类似于基本示例@ http://php.net/manual/en/class.iterator.php)。
答案 1 :(得分:0)
刚刚跑过这个我以前没有注意到的旧问题(不幸的是!)。
PHP中的委托通常可以通过装饰器来处理。
使用IteratorIterator class很容易实现具体的迭代器的委派。迭代器模式也已经是一个装饰器模式,所以已经有了这个可以重用的好类。
它并没有完全隐藏装饰的迭代器(see getInnerIterator()
),但你最终可能不会关心这个问题。
让我们看一个代表Iterator::current()
:
class Delegate extends IteratorIterator
{
public function current() {
$current = parent::current();
// do your delegated operation on $current
return $current;
}
}
然后,您可以通过将迭代器放入委托中来创建委托:
$delegate = new Delegate($iterator);
然后使用委托而不是原始迭代器。
有时候你需要一个真正的装饰器来完全包装原始迭代器作为主题。 Iterator-Garden中提供了这样的示例:IteratorDecorator。