шаблоны проектирования — абстрактные классы PHP и защищенные методы

Как заголовок сказать, у меня есть проблема с этим кодом:

abstract class AClass {
abstract protected function a1();
abstract protected function a2();

public function show() {
return $this->a1() . "<br>" . $this->a2();
}
}class A1 extends AClass {

protected function a1() {
return 'A1a1';
}

protected function a2() {
return 'A1a2';
}
}

class A2 extends AClass {

protected function a1() {
return 'A2a1';
}

protected function a2() {
return 'A2a2';
}
}

class AA {

public function __construct() {
$a11 = new A1();

$a22 = new A2();

$this->inter($a11);
$this->inter($a22);
}

private function inter(AClass $class)  {
echo $class->show();
}
}

$aa = new AA();

Это бросание:

Неустранимая ошибка: вызов защищенного A1 :: a1 () из контекста ‘AA’ в C: \ xampp \ htdocs \ Learning \ index.php в строке 38

Строка 38 такова:

$a11 = new A1();

Я не понимаю, почему выдает эту ошибку, если я не вызываю a1 () в этой строке.

Спасибо и всего наилучшего

Хавьер

2

Решение

В строке 38 вы создаете экземпляр класса A1, поэтому вызывается конструктор: это function a1() в строке 15. Так как имена классов нечувствительны к регистру, имена конструкторов тоже.

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

Если вы хотите протестировать только абстракцию обычными методами, просто переименуйте ваши функции, чтобы они не были конструкторами.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector