作为一个实验,我试图编写一个通用的MVP框架。C#趣味与泛型 - 相互依赖
我开始:
public interface IPresenter<TView> where TView: IView<IPresenter<...
{
TView View { get; set;}
}
public interface IView<TPresenter> where TPresenter:IPresenter<IView<...
{
TPresenter Presenter { get; set; }
}
显然,这不能工作,因为TView
和TPresenter
的类型不能得到解决。你会永远写下Type<Type<...
。因此,我的下一次尝试是这样的:
public interface IView<T> where T:IPresenter
{
...
}
public interface IView:IView<IPresenter>
{
}
public interface IPresenter<TView> where TView: IView
{
...
}
public interface IPresenter: IPresenter<IView>
{
...
}
这实际上编译,你甚至可以从这些接口继承,像这样:
public class MyView : IView, IView<MyPresenter>
{
...
}
public class MyPresenter : IPresenter, IPresenter<MyView>
{
...
}
的问题是在类定义,您必须定义声明的任何成员在泛型中两次。不理想,但它仍然编译。当您真正尝试从视图访问Presenter的成员时,问题的开始会逐渐增加,反之亦然。当你尝试编译时你会得到一个模糊的引用。从两个接口继承时,有什么办法可以避免这个成员的双重实现?甚至有可能在编译时解析两个相互依赖的泛型类型?
正是。我只是将C++中的“被动视图”框架放在一起,而真正需要成为模板的唯一组件是基本主持人IPresenter,其中T是特定的视图类型。 class MyPresenter:protected IPresenter {} –
kert
2010-05-26 06:04:19