en C ++, j'ai souvent besoin de NVI pour obtenir cohérence dans mes API. Je ne vois pas cela utilisé autant d'autres chez c #, cependant. Je me demande si cela est parce que c #, en tant que langue, offre des fonctionnalités qui rendent NVI inutile? (J'utilise toujours NVI en C #, cependant, si nécessaire.) P>
4 Réponses :
Je pense que NVI est aussi utile en C # tel qu'il est en C ++. Je vois cela utilisé très souvent chez mon entreprise. P>
Je pense que l'explication est simplement qu'en C #, le «traditionnel» de style Java de style Java est beaucoup plus enraciné et NVI court à contre-courant. C # a une réelle interface code> code>, tandis que NVI s'appuie sur "l'interface" étant une classe de base. C'est comme ça que c'est fait en C ++ quand même, il s'adapte naturellement là-bas. P>
en C #, il peut encore être fait, et c'est toujours un idiome très utile (beaucoup plus donc, je dirais que des interfaces "normales"), mais cela nécessite que vous ignorez une fonction de langue intégrée. p>
De nombreux programmeurs C # ne penseraient tout simplement pas à une classe NVI comme étant "une interface appropriée". Je pense que cette résistance mentale est la seule raison pour laquelle il est moins courant dans C #. P>
C # pose un problème avec NVIS en supprimant plusieurs héritages. Bien que je pense que le héritage multiple génère plus de mal que bien, il est nécessaire (dans la plupart des cas) pour NVI. La chose la plus simple qui saute à l'esprit: une classe en C # ne peut pas mettre en œuvre plus d'une NVI. Une fois que l'on découvre cet aspect désagréable et ailleurs, parlant de Et aussi loin que .NET Framework va, il y a un mécanisme à faire juste que: Inject code «orthogonal», afin de dire à la logique principale à portée de main. Je parle de tout ce que MarshalbyRef / TransparentProxy Business, je suis sûr que vous en avez entendu parler. Cela fait sérieusement l'impact des performances, cependant, donc pas de la grosse chance ici. P>
Il y a également eu de nombreuses tentatives visant à mettre en œuvre le même concept à travers d'autres techniques, de la construction de façades à la saleté mentionnée ci-dessus au post-traitement du MSIL. P>
Cette dernière approche arrive pour faire appel à la vôtre le plus, car elle peut être faite transparente (en incorporant les étapes nécessaires à sa routine de construction), cela n'affecte pas la performance (plus que ce qui est absolument nécessaire d'exécuter réellement le "orthogonal "Code) et il n'implique pas une sorte de" piratage "ou ingénierie inverse, puisque MSIL est ouvert et bien documenté. P>
ici on peut trouver ces points discutés plus en détail, ainsi que Plus d'informations et des liens vers des outils réels. Utiliser Google dans le même but est également acceptable. : -) p>
bonne chance. p>
AVERTISSEMENT, POSTSHARP peut être une addiction. ; p
Trey Nash dans son livre accéléré C # favorise la Modèle NVI comme une forme canonique en C #. P>
Je ne sais pas qui a écrit l'article que vous référez ( Plus C ++ Idiomes / interface non virtuelle ), mais je sens que l'auteur a raté le point. P>
... p>
Je dirais que, philosophiquement, il y a peu de différence (en C #) entre une classe entièrement abstraite (c'est-à-dire aucune implémentation que ce soit) par rapport à une interface. Sur la surface, ils peuvent tous deux fournir une signature de méthodes pouvant être effectuées et nécessiter quelque chose d'autre pour mettre en œuvre cette fonctionnalité. P>
avec C #, vous programmeriez toujours une interface si ce dont vous avez besoin est une interface. Vous utilisez uniquement une classe de base (abstraite) car vous souhaitez également la réutilisation de la mise en œuvre. P>
De nombreuses bases de code combinent celles-ci et programme à l'interface en plus de fournir une hiérarchie de classe comme implémentation par défaut pour l'interface. P>
Si votre seule motivation à utiliser NVI en C ++ serait d'avoir une interface, alors non, vous n'allez pas utiliser cela dans C # car la langue / CLR fournit des interfaces en tant que fonctionnalité de première classe. P>
Dans mon esprit, NVI n'a jamais été sur les interfaces. C'est toujours un excellent moyen de mettre en œuvre le Modèle de modèle modèle. P>
L'utilité se manifeste dans la maintenance du cycle de vie de code (facilité de changement, extension, etc.) et fournit un modèle d'héritage plus simple. P>
Mon avis: Oui, NVI est très utile dans C #. P>
Quelles fonctionnalités C # rendent inutile d'intérêt?
Eh bien, c'est ce que je me demandais, car je ne les vois pas moi-même - j'utilise nvi. :)