2011-10-25 3 views
2

jehéritage laid en C#

public class ViewBaseBase : UserControl 

Ensuite, je dois

public class ViewBase<TPresenter, TIView> : ViewBaseBase 

Ce qui nous amène bien sûr à

public class AView : ViewBase<ConcretePresenter, IView> 

Le raisonnement, je voudrais une manière non générique accéder à ViewBase polymorphiquement sans connaître TPresenter, TIView.

Est-ce que cela semble "faux" à quelqu'un? Je ne sais pas, ça marche, ça ne me semble pas me causer de problèmes, mais ça me semble "mal" comment. Peut-être que c'est le nom ViewBaseBase, je pourrais probablement utiliser une interface à la place, mais j'aime vraiment avoir l'héritage UserControl à ce niveau car toute ViewBase doit être un UserControl ...

+0

C'est difficile à dire sans savoir ce que font ViewBaseBase et ViewBase. J'utilise rarement l'héritage, et je n'ai jamais trouvé tout ce qui est utile dans mon code d'application (les bibliothèques, les installations de support sont une autre histoire). –

Répondre

4

Vous ne pouvez pas faire grand-chose à moins d'avoir un classe de base absolue non générique, si vous souhaitez accéder à ce contenu de manière polymorphe. Vous avez également dit que chaque ViewBase doit être un UserControl, mais cela ne signifie pas que vous ne pouvez pas utiliser les interfaces. Considérez ceci:

public interface IViewBase 
{ 
} 


public abstract class ViewBase<IPresneter, TIView> : UserControl 
                , IViewBase 
{ 
} 


public class AView : ViewBase<ConcretePresenter, IView> 
{ 
} 

AView est maintenant un UserControl et un IViewBase. Personnellement, je pense que c'est plus propre.

+0

Oui, c'est à peu près ce que j'ai déménagé. C'est sympa d'avoir la confirmation ou au moins un peu de back up que je ne deviens pas folle :) Merci – Ian

2
public class ViewBaseBase : UserControl 

Si une ViewBaseBase doit être un UserControl, cela est préférable à une interface car elle l'applique. Si ViewBaseBase fournit du code plutôt que de simples signatures (tout est abstrait), alors c'est la seule façon possible de faire les choses sans convolutions vraiment lourdes, car C# ne fournit pas d'héritage multiple. Si ViewBaseBase ne fournit que des signatures (tout est abstrait) et que quelque chose pourrait éventuellement être une ViewBaseBase sans être un UserControl (même si ce n'est pas le cas dans votre projet), alors je considérerais une interface.

Une grande partie de la même logique intervient aux niveaux suivants de la hiérarchie.

Sur la hiérarchie globale, est-ce que cela vous gêne dans tous les cas? Si c'est le cas, cela peut valoir la peine d'être refactorisé d'une manière ou d'une autre, mais si ce n'est pas le cas, je ne ferais même pas de pause pour y réfléchir. Après tout, le but de la hiérarchie des classes est de rendre la vie des développeurs plus facile, alors que cela soit ou non le problème ultime.

+0

Non ce n'était pas gênant, ça marche parfaitement. L'un des avantages qu'il avait avant de le refactoriser à une interface était différents niveaux d'accès sur les propriétés membres de ViewBaseBase. Rien de ce qui découle de ViewBaseBase ne devrait jamais être un usercontrol. C'était juste "mauvais". Je dois continuer à le mettre entre guillemets parce que c'était une intuition, l'intuition plutôt que quelque chose de solide – Ian

+1

Je préférerais rester avec ce que vous aviez alors. Il semble - d'après ce que je comprends de ce que vous faites - être ce qui modélise le plus votre intention, qui est le point entier de la programmation dans les langages de haut niveau. S'éloigner de cela sans raison me semble beaucoup plus mal. –