Я искал ответ весь день, но я не могу найти его. Извините, если я не имею никакого смысла, я теряю рассудок по этому поводу.
Вот что я пытаюсь сделать:
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
есть какие-либо отношения.