去年我看到一些源代碼(C++),其作者在基類中聲明靜態函數,但將其定義留給派生類。我記得有一個約束,即只有一個派生類被允許定義上述靜態函數。委託給派生類的靜態方法定義(C++)
我知道重寫靜態方法是不可能的,但這個技巧正是我所需要的。我只是不能讓它在我的代碼中工作:)有沒有人知道這個功能?
讓我們看看爲什麼這會有用。假設我們有一些基類(Shape)及其派生類(Circle,Triangle ...)。假設Shape是我的核心架構的一部分,派生類被視爲插件。我不想在未來改變我的核心架構。所以我們有:
class Shape
{
//other stuff here
static Shape* Factory();
}
class Circle:Shape
{
//other stuff here
static Shape* Factory();
}
形狀是一種抽象類,它不會實現Factory方法。方法由一個(且僅有一個)派生類實現。在實現中派生類將返回自己的新實例,所以它只是一個工廠方法。這一招使得它的作者使用的客戶端類此靜態方法在下列方式:
class Client
{
public Shape* shape;
public Client();
//other stuff here
}
在實現構造的,他有這樣的事情:
Client::Client()
:shape(Shape::Factory())
{
}
這樣,他才能夠實例化「右」而不改變引擎中的核心類。當他想要在覈心類中使用其他形狀時,他只需要在該派生類中定義靜態的Factory方法(並刪除其他派生類中的現有方法)。
這樣我們就有了某種「靜態多態性」。我無法在網絡上找到有關此技術的任何信息。它甚至有名字嗎?如果在C#語言中可以實現這樣的功能,我特別感興趣? :)
在此先感謝,並抱歉我的英語不好。
刪除此評論 – Kovasandra 2011-02-02 09:38:30
是的,靜態方法是在派生類的cpp文件中定義的。這正是我想要實現的:)但是我無法讓它在我的代碼中工作,因爲當我將靜態類定義放入派生類cpp文件時,編譯器報告基類不可訪問。我想我的問題的答案是:「檢查兩個類是否在相同的DLL/EXE」? :)你能告訴我更多關於C#委託和相同技巧的泛型版本嗎?提前致謝。 – Kovasandra 2011-02-02 09:45:24