我有一个通用的 Collection 类,具有各种公共 getter 方法。
要从集合中获取一项,请调用 get()。还有几种返回多个项目的方法:getMany()、getRange()、getAll()、find()、findAll()、query()、queryAny() 等。
在内部,所有这些返回多个项目的方法都有一个重复调用 get() 的循环,因为它们聚合了要返回的单个项目。
一个简化的例子:
public function get($key){
return $this->collection[$key];
}
public function getMany($keys){
$many = array();
foreach ($keys as $key){
$many[] = $this->get($key);
}
return $many;
}
当我想以不希望客户端能够访问 Collection 中的单个项目的方式扩展 Collection 时,就会出现问题。基本上,我想禁止访问 get() 方法。
我不能让 get() 成为私有或受保护的函数,因为它在父类中是公共的。
我也不能以使其不起作用的方式覆盖 get()(即只用返回覆盖它,或抛出异常),因为所有其他方法都依赖于 get(),我希望它们保持功能。
我知道我可以重写所有依赖 get() 的方法来依赖一些新的受保护方法(即 getOne()),但这会违反 DRY 原则。
我不想做的事:
class DataSet extends Collection{
public function get(){
throw new Exception('get() not implemented in DataSet');
}
protected function getOne($key){
return parent::get($key);
}
public function getMany($keys){
$many = array();
foreach ($keys as $key){
$many[] = $this->getOne($key);
}
return $many;
}
}
如果我执行上述操作,我将不得不重写六个方法(其中一些非常复杂),它们与父类的方法只有几个字符不同。
那么......我还有什么其他选择?是否有不同的手段达到相同的目的......?