我一整天都在寻找答案,但我似乎无法找到答案。对不起,如果我没有多大意义,我会对此失去理智。
这是我正在尝试做的事情:
abstract class Parent {
abstract public function Test();
}
class Child1 extends Parent {
abstract public function Test() {
echo "Test!";
}
}
class Child2 extends Parent {
public function Test2() {
echo "Test2!";
$this->Test(); // Child1::Test();
}
}
再次,抱歉,如果我没有多大意义。如果你需要我,我会尝试解释更多。
答案 0 :(得分:1)
你做不到。你正在尝试做的事情在OOP中毫无意义。如果要从第一个Child执行Test()
,则需要在父级中移动该函数。
编辑:好吧,我会更全面:
您正在尝试调用另一个子函数,该子函数只有父类。 Child1
和Child2
与String
尽可能接近,Integer
可以使用Java(或任何其他OOP语言)。想象一下,你在int上调用.upper()
函数:它没有意义。
答案 1 :(得分:1)
这不是一个OOP模式,并且没有任何我知道的OOP语言(除了内省魔法): 关于Child1类,Child2什么都不知道(也没有)。它们可以独立定义。
我认为在这一点上你应该解释你的需求是什么。我想我们可以通过一些设计模式来帮助你。
答案 2 :(得分:1)
您缺少抽象类和方法的概念。
抽象类是定义一些基本行为但无法实例化的类。它们被设计为子类。
这些是需要由扩展类实现的方法。与接口类似,抽象方法在没有实现的情况下定义行为。
在您的代码中,您使用抽象方法声明了一个抽象类。
abstract class Parent {
public abstract function Test();
}
当另一个类子类Parent
时,它必须实现抽象方法,使其具体化。
class Child extends Parent {
public function Test() {
echo "Test!";
}
}
类或实例没有兄弟的概念。类不能知道谁是其父类的子类并以静态方式访问它。
答案 3 :(得分:1)
这里有几个问题:
Parent
是保留字Child1
包含一个抽象方法,因此它不能包含正文。Child2
扩展了Parent
,但未实施Test()
方法。结果,这些都不会实例化。 Child2()应该扩展Child1(),(或实现Test()
方法本身)。纠正这些问题,修复PHP可能告诉你的任何其他错误:
$p = new Child2();
$p->Test2();
应该给你这个:
Test2!Test!
答案 4 :(得分:0)
Test
中的Child1
覆盖函数不应该是是抽象的(正如您所定义的那样)。要从Test
的{{1}}函数调用Child1
Test2
函数,请使用:
Child2
你可以做的只是因为它被定义为 public ,而不是因为Child1 foo = new Child1();
echo foo->Test();
和Child1
有任何关系。