2010-03-19 82 views
3

作为一个实验,我试图编写一个通用的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; } 
} 

显然,这不能工作,因为TViewTPresenter的类型不能得到解决。你会永远写下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的成员时,问题的开始会逐渐增加,反之亦然。当你尝试编译时你会得到一个模糊的引用。从两个接口继承时,有什么办法可以避免这个成员的双重实现?甚至有可能在编译时解析两个相互依赖的泛型类型?

回答

2

我觉得这里的问题是,你不应该需要IViewIPresenter接口既可以是通用的 - 在MVP框架要么认为应该直接调用主持人驱动形式(在这种情况下视图对某些演示者类型应该是通用的),或者视图应该完全不知道演示者并通过事件进行通信(在这种情况下,演示者应该对于特定视图类型是通用的)。

+0

正是。我只是将C++中的“被动视图”框架放在一起,而真正需要成为模板的唯一组件是基本主持人IPresenter ,其中T是特定的视图类型。 class MyPresenter:protected IPresenter {} – kert 2010-05-26 06:04:19

3

这是编译,但我不确定这是要走的路线。

public interface IPresenter<P, V> 
    where P : IPresenter<P, V> 
    where V : IView<P, V> 
{ 
} 

public interface IView<P, V> 
    where P : IPresenter<P, V> 
    where V : IView<P, V> 
{ 
} 

public class MyView : IView<MyPresenter, MyView> 
{ 
} 

public class MyPresenter : IPresenter<MyPresenter, MyView> 
{ 
} 
0

你的观点应该采用你的模型的类型,比如TModel。主持人应该采取一种TView。我不认为应该有一个TPresenter。