作爲一個實驗,我試圖編寫一個通用的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