2011-12-19 41 views
-4

任何人都可以給我一個例如下面所需的OOP結構請。php oop界面或抽象類

我想要一個主類(超級類)(接口或抽象類?),其中所有從其擴展的其他類都可以從主超類的實例調用它們的函數。

例如

class mainSupoerClass() { 

} 

class doWork exends mainSupoerClass(){ 
    public function addEntity(){ 
     //do stuff for entity 
    } 
} 

我希望能夠做到這一點:

$data = new mainSupoerClass; 
$data->addEntity(); (doesnt belong to this class but its fetching the function from doWork class) 

誰能給我正確的OOP結構開始開展這項工作?

+0

你能拼寫單詞嗎? 「giv me n」是什麼意思?你在尋找類定義語法的Python教程嗎? – 2011-12-19 15:43:25

+3

你明白了,那就是問題所在。鴨子可以飛,鴨子是動物 - 但這並不意味着所有的動物都可以飛。 – Cubic 2011-12-19 15:43:34

+0

你想要做的事情不可能有充分的理由。你應該考慮一個不同的策略來解決你的問題。如果我是你,我會描述實際問題,而不是詢問如何實施不可行的解決方案。 – 2011-12-19 15:57:01

回答

1

簡而言之,你不能。您必須實例化擴展類,並且您將獲得實例化類以及父類/類中的所有函數。

是否有任何理由需要這樣做?

1

這不會按照你描述它的方式工作。 PHP(或任何其他語言)都可以知道你引用了哪個派生類。如果你實例化doWork而不是mainSupoerClass,它會起作用。

我認爲你在尋找工廠模式,但我不確定。 使用該模式,您可以構建一個接口(接口或抽象類),並讓工廠實例化該類的任何後代。

現在你的代碼不需要知道它是哪個實例,因爲它可以調用在接口/抽象基類中聲明的任何方法。

接口在這方面更加靈活。如果你創建一個抽象類,你將需要從該類派生所有其他類。通常這不會是一個問題,但有時你需要一個全新的實現。在這種情況下,界面更好。您可以在完全不同的類中實現接口,並仍然使用PHP的typehinting來驗證傳遞給函數或方法的任何對象是否實現了接口。

0

即使它被稱爲超級類,它並不意味着它具有在別處定義的所有類。該方法如下:

[super] --> [concrete] 

,而不是

[concrete] --> [super] 

所以具體的類繼承了父。然後,具體類將擁有超類的所有內容以及具體類所擁有/覆蓋的內容 - 但不是相反的方式。

class Super 
{ 
    public function a() {} 
} 

class Concrete extends Super 
{ 
    public function b() {} 
} 

Super::a(),此外Concrete::b()。但Super將永遠不會有::b()

此外,即使你有多個類,總有一個實例,而不管是多少類化合物通常被稱爲對象:

$object = new Concrete; 

這使得Concrete對象。

+0

你在「具體」與「派生」或「子類」混淆。我有類(「小工具」),具體類派生的子類不是「具體」。最終這些子類具有「具體」的子類 – umlcat 2011-12-19 16:03:49

+0

這些術語與代碼示例相關。 – hakre 2011-12-19 20:32:49