6
votes

Questions sur un article Présentation de l'interface C ++

J'ai lu un article sur les interfaces C ++ ( http://accu.org/index .php / Journaux / 233 ) Et je suis complètement perdu à la partie où il est indiqué que toutes les fonctions de membre virtuel devraient être rendues privées (la section intitulée "Renforcement de la séparation"). Il n'a pas de sens pour moi du tout.

Selon l'auteur, le code est comme ceci: p> xxx pré>

donc nous avons donc une fonction virtuelle pure qui est publique et sa mise en œuvre (dans la classe de ligne) qui est privée. p>

pourrait-on expliquer comment la fonction mobile_x peut être appelée? Son spécificateur d'accès est privé, il entraînera une erreur si j'essaie de le faire: P>

line my_line(point(0,0), point(1,2));
my_line.move_x(-1); // does not compile


1 commentaires

J'ai juste essayé de construire le code et il ne parvient pas à compiler parce que le destructeur est privé ...


4 Réponses :


6
votes

L'idée est que vous utiliseriez ces méthodes via une référence ou un pointeur sur forme . xxx

ceci pourrait être justifié sur les motifs de "révéler seulement ce dont vous avez besoin pour ", ou comme une forme d'auto-documentation. Il prouve que les méthodes ne sont appelées que de la manière prévue.


5 commentaires

Il est considéré comme une meilleure habitude de programmation pour forcer le programmeur (vous-même) à utiliser uniquement l'interface.


Je ne peux pas dire que j'aime beaucoup l'idée; Si je veux une ligne qui est ce que je veux, pas une forme qui se trouve être une ligne. Si j'ai une fonction qui nécessite seulement les méthodes fournies par la forme, je vais passer la ligne dans cette fonction comme une forme, je ne peux tout simplement pas voir pourquoi vous feriez cela, +1 pour l'explication cependant.


Je suis d'accord que ce n'est pas un conseil changeant de la vie. Comme indiqué par les deux lignes ci-dessus, il ne limite pas beaucoup rien - provoque simplement une inconvénient mineure si l'utilisateur semble avoir besoin de casser la règle.


Merci beaucoup d'écouteurs. Il semble avoir un sens maintenant. Donc, tout ce qu'ils ont fait est de forcer la fonction à appeler par une variable avec RTTI de (forme &) ou (forme *), plutôt que (ligne &) ou (ligne *)


Oui, sauf la partie à propos de RTTI. Le type de compilation de la variable de référence / pointeur est forme et à l'exécution, il peut se référer / pointer vers une ligne .



2
votes

Je pense que l'article met en évidence la justification de cette citation:

Maintenant, la seule chose que les utilisateurs puissent faire avec la ligne est de créer des instances. Tout L'utilisation doit être via son interface - c'est-à-dire forme, appliquant ainsi plus fort Interface / séparation de la mise en œuvre. Avant de quitter ce sujet, il est important d'obtenir quelque chose de droit: le point d'exécution de la L'interface / la séparation de la mise en œuvre est ne pas dire aux utilisateurs quoi faire. Plutôt, L'objectif est de sous-tendre la Séparation logique - Le code maintenant explique que l'abstraction clé est forme, et cette ligne sert à fournir une implémentation de la forme.

c'est-à-dire que ligne n'est pas par lui-même intéressant. Il s'agit simplement d'une implémentation de l'interface , et il peut y avoir d'autres implémentations. Vous êtes particulièrement intéressé par l'interface . Par conséquent, vous ne devez accéder à la mise en œuvre que via cette interface et non comme une classe autonome.


0 commentaires

4
votes

Si vous avez par exemple l'objet line , vous serez peut-être tenté d'appeler ses méthodes. Mais si la seule façon dont vous pouvez les obtenir est en demandant une interface de forme , alors l'objet recherche moins d'un objet et plus comme une collection d'interfaces.

Cela a plus de sens si vous imaginez une ligne implémentant plusieurs interfaces.


0 commentaires

3
votes

Ce conseil est applicable aux hiérarchies homogènes uniquement - c'est-à-dire des hiérarchies dans lesquelles des classes dérivées introduisent de nouvelles fonctions (à l'exception des constructeurs peut-être) et de remplacer les fonctions de classe de base. Dans ce cas, vous n'avez évidemment pas besoin de travailler avec instance directement - uniquement via le pointeur / référence à forme . .

Lorsque vous avez une hiérarchie moins homogène, ce conseil n'a pas beaucoup de sens: comment quelqu'un l'applique-t-il aux cas où la classe dérivée introduit de nouvelles fonctions ou les hérite d'une autre classe de base? Dans ce cas, vous voulez parfois travailler directement avec des objets de classe dérivée directement, et ce conseil n'engagerait que des inconvénients.

Développement ultérieur de cette idée - Moins radical et utilisable dans plus de contextes - Non virtuel Interface (NVI) de Sutter Herb.


0 commentaires