访问兄弟方法

时间:2013-08-04 19:56:12

标签: php oop

我一整天都在寻找答案,但我似乎无法找到答案。对不起,如果我没有多大意义,我会对此失去理智。

这是我正在尝试做的事情:

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();
    }
}

再次,抱歉,如果我没有多大意义。如果你需要我,我会尝试解释更多。

5 个答案:

答案 0 :(得分:1)

你做不到。你正在尝试做的事情在OOP中毫无意义。如果要从第一个Child执行Test(),则需要在父级中移动该函数。

编辑:好吧,我会更全面:

您正在尝试调用另一个子函数,该子函数只有父类。 Child1Child2String尽可能接近,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有任何关系。