2010-08-28 186 views
2

我有一個問題,我的MVP結構是建立在通用的演示者,視圖等,我覺得我違反幹,我不知道如何解決它。MVP,仿製藥和幹

例子。

public class Presenter<TView, TModel> 
    where TView : IView 
    where TModel : Model 
{} 

到目前爲止,一切都很好,但我希望能有像這樣

public class Presenter<TView, TModel> 
    where TView : IView 
    where TModel : Model 
{} 

public class Model<T> 
{ 
    public T Value { get;set; } 
} 

但是,這不能編譯,因爲對模型中的其中需要泛型參數。 的修復:

public class Presenter<TView, TModel, TModelType> 
     where TView : IView 
     where TModel : Model<TModelType> 
    {} 

而且它在這裏,我覺得我違反了幹,就拿

public class MyPresenter : Presenter<IMyView, MyModel, string> 
{} 

public class MyModel : Model<string> 
{} 

我覺得不舒服指定字符串類型的兩倍,在主持人,並在模型中, 我只不要指定主持人使用MyModel作爲模型,我不關心什麼類型的模型(泛型)。一種解決方案是刪除模型的通用約束,但是我無法創建我想要的通用模型類層次結構。

我在想整個MVP /泛型的東西嗎?

回答

3

在C++中,這可以通過typedef來解決 - 而C#並不是真的。

public class Model<T> 
{ 
    typedef T TModelType; // this doesn't exist in C# 
    public T Value { get;set; } 
} 

然後,

public class Presenter<TView, TModel> 
    where TView : IView 
    where TModel : Model<TModel::TModelType> 
{} 

有一種類型的別名,你可以使用

using NewName = any_type<even_generics<with_generics>> 

做但它是基於文件 - 你不能在一個類中使用它。

我可能會做這樣的

  1. 重命名Model<T>ModelOf<T>
  2. 做一個模型基類ModelOf<T>ModelOf<T> : Model
  3. 使用where TModel : Model

模式本身將是有益的定義不依賴於TModelType的接口方法。

+1

不錯,但不是基礎模型我定義了一個IModel接口。 – Marcus 2010-08-28 16:53:52