[英]php abstract class extending method parameter type or type hint type
考慮這種情況,我有一個抽象類,孩子們用它來繪制藍圖並用它做不同的動作。 現在我有多個類來擴展它並使用藍圖執行稍微不同的操作,因此我有所述藍圖的擴展版本,我需要每個子類來獲取。
因此,我想將抽象類中的屬性或相應的函數輸入屬性定義/類型提示為 any,然后在每個子類中指定屬性類型。
但我不能這樣做,因為 PHP 7 給了我一個錯誤
Declaration B::setBlueprint() must be compatible with A::setBlueprint()
藍圖類
class Blueprint {
public $id;
}
class ChildBlueprint extends ParentBlueprint {
public $someOtherPropINeedOnlyInThisClass;
}
以及使用這些藍圖的抽象類
abstract class A {
abstract public function setBlueprint( ParentBlueprint $_ );
}
class B extends A {
public function setBlueprint( ChildBlueprint $_ ) {}
}
我的意思是我需要一個從所有 A、B、C、...、X、Y 類中派生的藍圖,因此將它排除在抽象類之外是沒有意義的。
這個問題有什么好的 OOP 解決方案?
你可以通過實現依賴倒置來克服這個問題:
interface Blueprint {
}
class ParentBluePrint implements Blueprint
{
public $id;
}
class ChildBluePrint extends ParentBlueprint
{
public $id;
}
abstract class A
{
abstract public function setBlueprint( Blueprint $_ );
}
class B extends A
{
public function setBlueprint( Blueprint $_ ) {}
}
在此處查看有關相關 SOLID 原則的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.