У меня есть абстрактный класс, который я наследую от:
abstract class Test { public function GetTests() { } }
и у меня есть конкретный вопрос, который я использовал для реализации абстрактных классов большую часть времени:
class Concrete extends Test { // No problemmos }
Недавно мне пришлось реализовать другую версию метода GetTests, и на самом деле я хотел перезаписать его, поскольку он встроен во всю мою маршрутизацию:
class Concrete extends Test { public function GetTests( $newArgument ) { // notice $newArgument } }
Однако я получаю это сообщение об ошибке:
Declaration of Concrete::GetTests() should be compatible with Test::GetTests()
Помимо копирования всех функций из абстрактного класса для этого конкретного, хотя мне нужно только реализовать этот метод по-разному … Есть ли способ обойти это?
Я понимаю, что мог бы:
abstract class Test { abstract public function GetTests(); }
Но вот почему я снукер, потому что у меня больше нет возможности изменять, как реализуется базовый класс Test … doh! … Если мне действительно не нужно …
Спасибо всем отличным ответам …
Я решил сам снукер (это будет больно, но это будет стоить того), и я создам экземпляр класса Test внутри класса Concrete, реализую конкретные версии всех методов класса Test, а затем внутри их просто вызывается экземпляр Тест-класс … Это означает, что в будущем (или даже сейчас) я просто не могу назвать эту функцию …
Для контекста:
/* no longer abstract */ class UnitOfWorkController { public function GetUnits() { // Implementation return View::make(...); } }
а также…
class SomethingController /* no longer extends the UnitOfWorkController */ { private $unitOfWorkController; public function __Construct() { $this->unitOfWorkController = new UnitOfWorkController(); } public function GetUnits() { return $this->unitOfWorkController->GetUnits(); // or I could just implement my own junk } }