我的MVP结构存在问题,该结构基于通用演示者,视图等。我觉得我违反DRY而且我不知道如何绕过它。
实施例
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; }
}
但是这不会编译,因为Model的位置需要泛型参数。 修复:
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作为模型,我不关心什么类型的模型(泛型)。一种解决方案是删除模型的通用约束,但是我无法创建我想要的通用Model类层次结构。
我对整个MVP /仿制品的想法是错误的吗?
答案 0 :(得分: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>>
但它是基于文件的 - 你不能在课堂上使用它。
我可能会这样做
Model<T>
重命名为ModelOf<T>
ModelOf<T>
(ModelOf<T> : Model
)where TModel : Model
模型本身对于定义不依赖于TModelType的接口方法很有用。