2010-08-28 144 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