C類擴展B.而B類擴展A1或A2,這取決於C的構造函數的參數。如何定義A,B和C類?在運行時將父類指派給類?
0
A
回答
2
Like deceze already points out,這是不可能的繼承。
你可以使用PECL的runkit_class_adopt
到基類轉換爲繼承的類,添加祖傳方法在適當的時候但runkit是你不想東西在你的產品代碼。
清潔OO方法這是使用一個Bridge pattern,得到對象在運行時在A類的實現,並由此
解耦從它的實現的抽象,使得可以獨立地變化。
它是如何工作
首先定義一個接口B和B本身來實現的每一個「父」。界面應該包含你想要B「繼承」的所有方法。我將這些術語放在引號中,因爲從技術上講,它們既不是父母,也不是繼承任何東西。
interface MyImplementation
{
public function doSomething();
// more methods …
}
然後定義實現此接口的類A1和A2並添加接口要求的方法。
class A1 implements MyImplementation
{
public function doSomething()
{
return 'A1';
}
// more methods …
}
class A2 implements MyImplementation
{
public function doSomething()
{
return 'A2';
}
// more methods …
}
接下來,建立B類,並使其需要在初始化的實現類之一。
abstract class B implements MyImplementation
{
protected $_implementation;
// more properties ...
public function __construct(MyImplementation $implementationObj)
{
$this->_implementation = $implementationObj;
}
public function doSomething()
{
return $this->_implementation->doSomething();
}
// more methods ...
}
正如你所看到的,通過我們的接口所需要的方法的任何調用都被委託給聚集的「父」對象,所以這取決於你傳遞到B,你會得到不同的結果。
現在定義C,我們只是讓它接受實現類的類名並在C中實例化它以將其傳遞給父類, B.
class C extends B {
public function __construct($bMethodImplementation) {
parent::__construct(new $bMethodImplementation);
}
}
,然後你可以做
$c = new C('A1');
echo $c->doSomething(); // echoes A1
$c = new C('A2');
echo $c->doSomething(); // echoes A2
4
既然你需要對父類進行硬編碼(class B extends A1
),這是不可能的(儘管運行時擴展/黑客,我不會推薦進入)。如果您需要這種靈活性,請考慮composition而不是繼承。
+0
事實上,*總是*贊成組合繼承! – 2010-11-13 08:57:39
相關問題
- 1. 在運行時更改類的父類
- 2. 在運行時使用派生類C++
- 3. Python派生類在派生類上自動運行類方法
- 4. 將父類指針傳遞給子代
- 5. 傳遞派生類指針時發生運行時錯誤C++
- 6. 將類指派給基類,該怎麼做?
- 7. 未能將派生類分配給基類指針?
- 8. 將派生類構造函數分配給基類指針
- 9. 在運行時將ID解析爲派生類型
- 10. 基類和派生類的運行時類型信息
- 11. 在運行時確定派生類的類型
- 12. 在目標c中指派派生類的基類指針
- 13. 在運行時動態解析並將基類轉換爲派生類型
- 14. 將指針基類轉換爲指向派生類的指針
- 15. 帶父類的派生類的函數指針
- 16. 在運行時指定對象類型
- 17. C++將父指針傳遞給父類構造函數
- 18. 如何將派生類傳遞給接受父類型的函數
- 19. 派生類不能引用父類
- 20. 將基類指針轉換爲未知的派生類指針
- 21. 將子類型的指針傳遞給採用父類指針的僞參數
- 22. 將類指派給css屬性選擇器
- 23. 將指針傳遞給另一個派生類
- 24. 何時使用派生類指針和基類指針
- 25. 爲什麼派生類中的測試重新運行父類測試?
- 26. 試圖派生類對象的地址賦給基類指針
- 27. 分配給派生類的基類指針
- 28. 父運行類方法
- 29. 如何將子類指派給非泛型類中的泛型字段
- 30. 調用從派生派生類的父類方法
標題與內容這個問題的衝突。哪一個是你的?確定基類或如何定義類? – stillstanding 2010-11-13 08:58:13