À titre expérimental, j'essaie d'écrire un cadre générique MVP.C# Fun avec les génériques - les dépendances mutuelles
J'ai commencé avec:
public interface IPresenter<TView> where TView: IView<IPresenter<...
{
TView View { get; set;}
}
public interface IView<TPresenter> where TPresenter:IPresenter<IView<...
{
TPresenter Presenter { get; set; }
}
Évidemment, cela ne peut pas fonctionner parce que les types de TView
et TPresenter
ne peuvent être résolus. Vous écririez Type<Type<...
pour toujours. Donc, ma prochaine tentative ressemblait à ceci:
public interface IView<T> where T:IPresenter
{
...
}
public interface IView:IView<IPresenter>
{
}
public interface IPresenter<TView> where TView: IView
{
...
}
public interface IPresenter: IPresenter<IView>
{
...
}
Cette compile en fait et vous pouvez même hériter de ces interfaces comme ceci:
public class MyView : IView, IView<MyPresenter>
{
...
}
public class MyPresenter : IPresenter, IPresenter<MyView>
{
...
}
Le problème est dans la définition de la classe, vous devez définir tous les membres déclarés dans le type générique deux fois. Pas idéal mais il compile encore. Le problème commence à grimper lorsque vous essayez d'accéder aux membres d'un présentateur à partir d'une vue ou vice versa. Vous obtenez une référence ambiguë lorsque vous essayez de compiler. Est-il possible d'éviter cette double implémentation d'un membre lorsque vous héritez des deux interfaces? Est-il même possible de résoudre deux types génériques mutuellement dépendants au moment de la compilation?
Exactement. Je ne faisais que mettre en place un framework de "vue passive" en C++, et le seul composant qui doit vraiment être un template est le présentateur de base, IPresenter où T est le type de vue particulier. class MyPresenter: protected IPresenter {} –
kert