Вызов дочернего объекта в родительском объекте - PullRequest
0 голосов
/ 12 апреля 2011

Я хочу знать, могу ли я создать дочерний объект в родительском объекте и использовать его ...

  • Я имею в виду, возможно ли это?
  • Это хорошая идея??
  • Что мне нужно, если я это сделаю?

Я использую дочерние классы самостоятельно и хочу использовать их в закрытой функции родительского класса.а также.

спасибо

вот какой-то источник, чтобы представить, что я имею в виду:

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 ]

2 голосов
/ 12 апреля 2011

Вы можете использовать абстрактные методы для делегирования определенных действий производным классам:

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

    protected abstract function do_something();
}

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

Это, конечно, не очень хорошая идея.Это зависит от того, чего вы хотите достичь и почему.Создание производных классов в конструкторе родителей (как указано в предыдущем примере) невозможно.Язык может позволить это, но это приведет к бесконечному циклу создания экземпляров.Вам обязательно нужно будет объяснить, почему вы это делаете.Иначе никто не сможет вам достаточно помочь.

1 голос
/ 12 апреля 2011

Я думаю, что большой вопрос должен заключаться в том, почему вы этого хотите. Я не могу придумать твердый дизайн, который бы имел класс, расширяющий что-то (например, по умолчанию может быть мебель, например, расширение GardenChair Chair) в родительском классе.

Вся идея в том, что все должно быть наоборот.

Если вы хотите вызвать 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(){
        ...
    }
}
1 голос
/ 12 апреля 2011

Похоже, что это плохая идея. ИМХО - это потребует значительного обслуживания, и вы создаете несколько тесных связей между классами.

Я бы порекомендовал создать абстрактную функцию в родительском элементе, которую каждый из детейбудет реализован со своей собственной логикой.

[EDIT], поскольку вы пытаетесь перебрать все дочерние объекты, я бы порекомендовал создать базовый класс, который обрабатывает всю логику, которая должна быть реализована для всех дочерних объектов, и переопределитьэто в каждом из дочерних классов, которые нуждаются в дополнительной логике, и вызовите родительскую функцию внутри него.

...