請考慮這一點。我想創建一個創建動物的工廠(模式,而不是創造一個新的起源)。我以爲我會聰明,創建具有3件事情,我需要這個工作類,使用仿製藥一勞永逸的工廠模式
- 返回一個抽象的動物委託
- 返回一個特定的動物,每動物製作方法
- 使用委託
厭倦這樣了,並獲得每次我需要使用工廠模式時各創建方法的一個實例,我想我會比較聰明,一次解決它所有。所以,我創造了這個漂亮的類
class Factorable<T> where T: class, new()
{
delegate T CreateDelegate();
static CreateDelegate DoCreate = new CreateDelegate (CreateSelf);
static T CreateSelf()
{
return new T();
}
}
class Factory<T> where T : Factorable<T>
{
public Factorable<T>.CreateDelegate CreationMethod ;
}
我想,很酷,我可以做出一流的(動物)從該類繼承,所以我沒有寫和所有實例的所有具體的創建方法動物。所有這一切都要歸功於泛型。幾乎...看到這個:
class Animal:Factorable<Animal> {...}
class Bird:Animal {...}
Factory genesis = new Factory<Animal>();
genesis.CreationMethod = Animal.DoCreate;
Animal instance = genesis.CreateAnimal(); //instance is a brand new abstract Animal
genesis.CreationMethod = Bird.DoCreate; //lets make it create birds!
instance = genesis.CreateAnimal(); // wrong, instance is still an abstract Animal
有沒有什麼辦法可以解決這個問題?我希望Bird繼承的CreateSelf方法來創建鳥類,而不是抽象動物(不必爲Bird寫一個新的方法)。有沒有一種方法可以指定Animal從Factorable繼承,但是有它的後代用它自己的類型覆蓋泛型T?
東西(這是愚蠢的代碼,不工作)這樣
class Animal:Factorable<Animal... or better the actual type of the class that has inherited>
也許我失去了一些東西,但一個'Animal'如何從自身'可分解'通用繼承? –
mclark1129
@MikeC這在C#中是可行的。 – MarcinJuraszek