在父对象中调用子对象

时间:2011-04-12 09:08:02

标签: php oop call

我想知道我是否可以在父对象中创建子对象并使用它...

  • 我的意思是它可以吗?
  • 这是个好主意吗?
  • 如果我这样做,我该怎么办?

我正在使用子类,我也希望在父类的私有函数中使用它们。

感谢

这里有一些来源想象我的意思:

class A{
    private $child_class1;
    private $child_class2;

    private function somefunction(){
        $this->child_class1 = new B();
        $this->child_class1->do_something();

        $this->child_class2 = new C();
        $this->child_class2->do_something();
    }
}

class B extends A{
    public function do_something(){
...
    }
}

class C extends A{
    public function do_something(){
...
    }
}

3 个答案:

答案 0 :(得分:2)

您可以使用抽象方法将某些操作委托给派生类:

class A {
    public function __construct() {
        $this->do_something();
    }

    protected abstract function do_something();
}

class B extends A {
    protected function do_something() {
        // ...
    }
}

这样做当然不是一个好主意。这取决于你想要达到的目标,以及原因。在父构造函数中创建派生类(如前面的例子所述)是不可能的。语言可能允许它,但它将导致无限循环的实例化。你肯定需要解释你为什么要这样做。否则,没有人能够帮助你。

答案 1 :(得分:1)

这似乎是一个坏主意恕我直言 - 它需要高维护,你在课间创造一些紧密的联系。

我建议在父母中创建一个抽象函数,每个孩子都会用它自己的逻辑来实现。

[编辑],因为你试图遍历所有子对象,我建议创建一个基类来处理所有需要对所有子进程实现的逻辑,并在每个需要额外的子类中覆盖它逻辑,并调用其中的父函数。

答案 2 :(得分:1)

我认为最重要的问题应该是你想要它的原因。我无法想出一个可以扩展某些东西的可靠设计(默认示例可以是家具,例如GardenChair扩展椅子)可以在父类中使用。

整个想法是它应该是相反的方式。

如果你想调用'do_something',你应该创建一个子实例,让它自己调用。如果您需要强制执行do_something,请尝试这样:

public abstract class A{
    public abstract funcion do_something();

    public function __constructor(){
        $this->do_something();
    }

}

public class B extends A{
    public funcion do_something(){
        ...
    }
}

public class C extends A{
    public funcion do_something(){
        ...
    }
}