PHP有一个称为后期静态绑定的特性,其中static
关键字在运行时被解析,并引用当前正在执行代码的类。考虑以下PHP代码:
class Collection
{
protected $items;
public function __construct(array $items = [])
{
$this->items = $items;
}
public function map(Closure $closure)
{
return new static(array_map($closure, $this->items));
}
}
class CatCollection extends Collection {}
如果我们要创建一个Collection
实例,我们将能够调用它的map
方法,这将返回一个Collection
实例。类似地,我们可以创建一个CatCollection
实例并调用它的map
方法,这将生成一个新的CatCollection
实例(而不是Collection
)。
$collection = new Collection([1, 2, 3]);
$doubled = $collection->map(function ($item) {
return $item * 2;
}); // Returns an instance of Collection containing items 2, 4, 6.
$cats = new CatCollection(['Keyboard', 'Grumpy']);
$titled = $cats->map(function ($cat) {
return 'Mr. ' . $cat;
}); // Returns an instance of CatCollection containing items 'Mr. Keyboard', 'Mr. Grumpy'.
发布于 2018-08-05 08:45:45
你可以用一些普通的愚蠢的东西来做这样的事情。
(在下面,E
是MyCollection
的元素类型,C
是MyCollection
的扩展类型。)
abstract class MyCollection<E, C extends MyCollection<E, C>> {
private final List<E> elements;
MyCollection(final List<E> elements) {
this.elements = new ArrayList<>(elements);
}
C map(final UnaryOperator<E> mapper) {
final List<E> mappedElements = new ArrayList<>(this.elements.size());
for (final E element : this.elements) {
mappedElements.add(mapper.apply(element));
}
return this.create(mappedElements);
}
abstract C create(final List<E> mappedElements);
}
class SubCollection<E> extends MyCollection<E, SubCollection<E>> {
SubCollection(final List<E> elements) {
super(elements);
}
@Override
SubCollection<E> create(final List<E> mappedElements) {
return new SubCollection<>(mappedElements);
}
}
我想不出有哪一次我不得不做这样的事情...
https://stackoverflow.com/questions/51690144
复制相似问题