Доступ к методу родства

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

Вот что я пытаюсь сделать:

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

Опять же, извините, если я не имею никакого смысла. Я попробую объяснить больше, если понадобится мне.

Это не шаблон ООП, и он недоступен ни на одном языке ООП, который я знаю (кроме магии интроспекции): Child2 ничего не знает (и не имеет) о классе Child1. они могут быть определены независимо.

Я думаю, что на этом этапе вы должны объяснить, каковы ваши потребности. Думаю, мы могли бы помочь вам, с некоторым шаблоном проектирования.

Вы не можете. То, что вы пытаетесь сделать, не имеет смысла в ООП. Если вы хотите выполнить Test() из первого Child, вам нужно переместить функцию в родительском.

EDIT: Ну, я собираюсь быть более всеобъемлющим:

Вы пытаетесь вызвать функцию другого дочернего элемента, которые имеют только общий родительский класс. Child1 и Child2 находятся так близко, как String и Integer могут быть на Java (или на любом другом языке OOP). Представьте, что вы вызывали .upper() в int: это не имеет смысла.

Здесь есть несколько вещей:

  • Parent – это зарезервированное слово
  • Child1 содержит абстрактный метод, поэтому он не может содержать тело.
  • Child2 расширяет Parent , но не реализует метод Test() .

В результате ничего из этого не создаст. Child2 () должен, вероятно, расширить Child1 (), (или реализовать метод Test() ). Исправьте эти проблемы, исправьте любые другие ошибки, которые PHP может рассказать вам об этом:

 $p = new Child2(); $p->Test2(); 

Должен дать вам следующее:

 Test2!Test! 

Вам не хватает концепции абстрактных классов и методов.

Абстрактные классы

Абстрактные классы – это классы, которые определяют некоторое базовое поведение и не могут быть созданы. Они предназначены для подкласса.

Абстрактные методы

Это методы, которые должны выполняться расширяющимся классом. Подобно интерфейсам абстрактные методы определяют поведение без реализации.

Ваш код

В вашем коде вы объявили абстрактный класс абстрактным методом.

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

Когда другой класс подклассов Parent он должен реализовать абстрактный метод, делающий его конкретным.

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

Доступ к методу родства

У класса или экземпляра нет понятия о брате. Класс не может знать, кто подклассифицирует своего родителя и получает доступ к нему статическим способом.

Функция переопределения Test в Child1 не должна быть абстрактной (как вы ее определяете). Чтобы вызвать функцию Test Child1 из функции Child2 используйте:

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

То, что вы можете сделать, только потому, что оно определено как общедоступное , а не потому, что у Child1 и Child2 есть какие-либо отношения.