2010-03-19 101 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。