我在继承链中有两个抽象类,最终将成为通用库:
abstract class Foo {
public function baz() {
echo 'Foo::baz()';
}
// other methods here
}
abstract class Bar extends Foo {
public function baz() {
echo 'Bar::baz()';
}
}
这两个类是由开发人员扩展的,我的问题是我想这样做,以便不能覆盖baz()
方法的实现(因为它们包含严格的RFC兼容代码) )。制作Bar::baz()
final
没问题;但是,如果我Foo::baz()
final
,那么Bar
本身显然也无法覆盖它。
PHP 5.4的trait
可能会提供一个实用的解决方案,但我不能放弃对PHP的支持< 5.4这个。我的最后一招是让它保持原样,并使用文档警告开发人员不要覆盖这种方法,但如果可能的话,我想找到更具体的东西。
我是否可以使用任何其他设计来强制执行这两个方法不应被覆盖,同时保持代码DRY(例如不删除继承并复制所有代码)?
答案 0 :(得分:2)
我想我有办法做到这一点。它比一个非常简洁的设计更具诀窍,但我认为我明白了这一点。
abstract class Foo {
private $bazBehaviour;
public function __construct($bazBehaviour){
$this->bazBehaviour=!empty($bazBehaviour)?$bazBehaviour:"defaultBazBehaviour";
}
final public function baz() {
$this->bazBehaviour();
}
final protected function defaultBazBehaviour(){
echo "Foo::Baz()";
}
// other methods here
}
abstract class Bar extends Foo {
public function __construct(){
parent::__construct("bazBehaviour");
}
final protected function bazBehaviour() {
echo 'Bar::baz()';
}
}
class toto extends Bar{
public function __construct(){
parent::__construct();
}
}
$d = new toto();
$d->baz();
使用PHP 5.3.13发送: 酒吧::巴兹()
答案 1 :(得分:0)
很抱歉,您的要求是矛盾的:
my problem is that I'd like to make it so that neither implementation of
the baz() method can be overridden
但是 会覆盖Foo:baz()
中的Bar
..因此,此处的设计/要求存在一些基本问题。