我根本不确定是否有这样的术语,但这就是我想做的事情
class A {
function a($a) {
return $a;
}
}
class B extends A {
function a($a) {
return parent::a('B' . $a);
}
}
class C extends B {
function a($a) {
return superparent::a('C' . $a);
}
}
$c = new C();
echo $c->a('C'); // "CC"
我想绕过所有的medial类并在第一次定义它的父级上调用该函数 - 这可能吗?
答案 0 :(得分:6)
不,这是一个糟糕的主意。您的所有课程C
都知道它扩展了B
。它不知道也不应该知道B
延伸到什么地方。 C
不能指望B
扩展任何内容,也不应该知道该父母的具体方法及其实现细节。您可能明天重构B
以扩展另一个类,或者根本不扩展任何类。如果您建立了这样的三级交叉依赖关系,代码将开始左右打破。
类只应通过继承或依赖注入与它们直接关联的对等体进行交互。
从逻辑上讲:B
为A
的行为添加必要的内容,使其成为“B
”,并添加C
要成为C
的东西。 C
建立在B
之上,因此B
C
所做的任何事情都应该如此。让C
“跳过”B
回A
表示您的逻辑和职责分配在您的班级层次结构中混淆。
答案 1 :(得分:2)
尽管有任何工程软件投诉(你想要做的事情是必须通过其他方法实现的),我认为我的两个例子都适合工作:
<?php
trait Bypass_trait {
public function super_ref() {
return parent::super_ref();
}
}
class A {
function a($a) {
return $a;
}
function super_ref() {
return $this;
}
}
class B extends A {
use Bypass_trait;
function a($a) {
return $this->super_ref()->a('B' . $a);
}
}
class C extends B {
use Bypass_trait;
function a($a) {
return $this->super_ref()->a('C' . $a);
}
}
$c = new C();
echo $c->a('C'); // "CC"
<?php
interface Bypass {
public function super_ref();
}
class A implements Bypass {
function a($a) {
return $a;
}
function super_ref() {
return $this;
}
}
class B extends A implements Bypass {
function a($a) {
return $this->super_ref()->a('B' . $a);
}
function super_ref() {
return parent::super_ref();
}
}
class C extends B implements Bypass {
function a($a) {
return $this->super_ref()->a('C' . $a);
}
function super_ref() {
return parent::super_ref();
}
}
$c = new C();
echo $c->a('C'); // "CC"
答案 2 :(得分:-1)
我可以将“A”视为抽象,然后让b和c覆盖它
答案 3 :(得分:-1)
您可以选择使用A::a('C' . $a)
调用哪种父方法。
调用像这样的父函数时,它不会静态调用它,就像parent::a()
一样。