3

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

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

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

再次,对不起,如果我没有多大意义。如果您需要我,我会尽力解释更多。

4

5 回答 5

1

您缺少抽象类和方法的概念。

抽象类

抽象类是定义一些基本行为并且不能被实例化的类。它们被设计为子类。

抽象方法

这些是需要由扩展类实现的方法。就像接口一样,抽象方法定义了没有实现的行为。

你的代码

在您的代码中,您声明了一个带有抽象方法的抽象类。

abstract class Parent {
    public abstract function Test();
}

当另一个类子类Parent时,它必须实现使其具体化的抽象方法。

class Child extends Parent {
    public function Test() {
        echo "Test!";
    }
}

访问兄弟方法

类或实例没有兄弟的概念。一个类不能知道谁继承了它的父类并以静态方式访问它。

于 2013-08-04T20:07:17.360 回答
1

这里有几个问题:

  • Parent是保留字
  • Child1包含一个抽象方法,所以它不能包含一个主体。
  • Child2extends Parent,但不实现该Test()方法。

结果,这些都不会实例化。Child2() 可能应该扩展 Child1(),(或实现Test()方法本身)。更正这些问题,修复 PHP 可能会告诉您的任何其他错误:

$p = new Child2();

$p->Test2();

应该给你这个:

Test2!Test!
于 2013-08-04T20:10:47.607 回答
1

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

编辑:嗯,我会更全面:

您正在尝试调用另一个孩子的函数,该函数只有父类共同。Child1并且与 Java(或任何其他 OOP 语言)Child2一样接近String并且Integer可以使用。想象一下,你.upper()在一个 int 上调用了 function:它没有意义。

于 2013-08-04T19:58:55.810 回答
1

这不是 OOP 模式,并且在我知道的任何 OOP 语言中都不可用(自省魔法除外): Child2 对 Child1 类一无所知(也不必知道)。它们可以独立定义。

我认为在这一点上你应该解释你的需求是什么。我想我们可以通过一些设计模式来帮助你。

于 2013-08-04T20:01:11.663 回答
0

中的Test覆盖函数Child1 不应该是抽象的(因为您正在定义它)。从使用函数调用Test函数:Child1Test2Child2

Child1 foo = new Child1();
echo foo->Test();

你能做的事情只是因为它被定义为public,而不是因为Child1Child2有任何关系。

于 2013-08-04T20:05:50.227 回答