我有一個抽象類,我繼承:抽象的誆騙 - PHP
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();
}
但是,這就是爲什麼我誆騙,因爲我不再需要修改底層測試類是如何實現的?衛生署的能力..除非我真的有..
感謝所有偉大的答案...
我已決定不再將自己的斯諾克(它會受到傷害,但這將會是值得的),我將在Concrete類中實例化Test類,實現所有Test類方法的具體版本,然後在其中調用實例化的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
}
}
由於'$ newArgument',它不兼容。您可以將此參數添加到摘要中,也可以將其從「混凝土」類中移除;但事實上,它必須兼容 – Brewal 2014-10-08 14:22:00
只是爲了看看我是否理解得當:你希望能夠覆蓋抽象類的功能嗎?如果我理解正確,您必須根據哪個版本的php製作您的'$ newArgument'選項(來自[此文檔](http://php.net/manual/en/language.oop5.abstract.php)),而不是聲明它並試圖用'func_get_args'獲得它可能? (真的不確定這最後一點) – Tensibai 2014-10-08 14:30:23
我不知道是誰回答,但我已經把我的解決方案放到OP的末尾,請給我反饋:) – Jimmyt1988 2014-10-08 15:25:09