2010-05-19 80 views
4

我有這樣的設計:如何使這個簡單的C#泛型工廠工作?

public interface IFactory<T> { 
    T Create(); 
    T CreateWithSensibleDefaults(); 
} 

public class AppleFactory : IFactory<Apple> { ... } 
public class BananaFactory : IFactory<Banana> { ... } 
// ... 

虛構AppleBanana這裏不一定有任何常見的類型(比object等,當然)。

我不希望客戶必須依賴特定的工廠,所以您可以只需要詢問FactoryManager以獲取新的類型。它有一個FactoryForType方法:

IFactory<T> FactoryForType<T>(); 

現在你可以像FactoryForType<Apple>().Create()調用適當的接口方法。到現在爲止還挺好。

但是在執行級別存在一個問題:如何將此映射從類型存儲到IFactory<T> s?天真的答案是IDictionary<Type, IFactory<T>>,但這不起作用,因爲T(我使用C#3.5)沒有類型協方差。我只是堅持IDictionary<Type, object>並手動進行鑄造?

回答

5

不幸的是,你被困在手工鑄造。然而,這種投射可以是實現細節並且不被消費者看到。例如

public class FactoryMap { 
    private Dictionary<Type,object> _map = new Dictionary<Type,object>(); 
    public void Add<T>(IFactory<T> factory) { 
    _map[typeof(T)] = factory; 
    } 
    public IFactory<T> Get<T>() { 
    return (IFactory<T>)_map[typeof(T)]; 
    } 
} 
+0

@code詩人,26秒:) – JaredPar 2010-05-19 16:01:50

+0

謝謝!這是關於我現在的;我覺得沒有太多的擺動空間可以使用協變。 – 2010-05-19 16:05:57