Bonjour,
Le pattern N.V.I., pour "non virtual interface" a été proposé par Herb Sutter dans son article "Virtuality, C/C++ Users Journal, 19(3), 2001" disponible ici:
http://www.gotw.ca/publications/mill18.htm
En résumé, il recommande, (quand on développe en C++) de rendre les fonctions virtuelles privées, et d'écrire une interface publique non virtuelle. Pour plus de détails sur ce pattern, je vous invite à lire l'article.
Utilisateur de python depuis peu, j'ai par réflexe appliqué les même recettes, considérée comme des bonnes pratiques dans mon langage de référence. Seulement le comportement qui en résulte n'est pas celui que j'attendais. En effet, si on considère l'exemple suivant:
A l'éxécution, ce code imprime
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 class A: def foo(self): self.__foo_impl_private(); self._foo_impl_protected(); def __foo_impl_private(self): pass; def _foo_impl_protected(self): pass class B(A): def __foo_impl_private(self): print 'coin' def _foo_impl_protected(self): print 'coin coin' if __name__ == "__main__": x = B() x.foo()
là ou je m'attendais à
Code : Sélectionner tout - Visualiser dans une fenêtre à part coin coin
On peut en déduire que le fait que __foo_impl_private soit privée empêche la classe de base d'appeler l'implémentation de la classe dérivée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 coin coin coin
Quelqu'un peut-il m'éclairer sur ce comportement ? Il semble que l'idée préconçue selon laquelle les méthodes de classes en python se comportent comme des méthodes virtuelles en C++ soit erronée.
Partager