(posté ailleurs mais sans réponse, je tente ma chance ici, étant plus
porté sur le C++)
dans http://www.objectmentor.com/resources/articles/lsp.pdf à propos du
LSP, l'exemple est donné à base d'un Square héritant d'un Rectangle (à
ne pas faire donc)
Auriez-vous une idée d'exemple qui poserait problème pour le cas d'un
Rectangle héritant d'un Square (ou si, à votre avis, le deuxième exemple
que j'ai codé suffit)?
Voici l'argument mis en avant dans l'article (en C++), je reprends
l'exemple donné dans l'article original :
(Un Square héritant d'un rectangle)
Le Fri, 27 Apr 2012 10:32:34 +0200, Lucas Levrel écrivait :
Le 26 avril 2012, JKB a écrit :
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char * même si je prends la peine de coller foo((int) 0). La solution pas élégante a été de rajouter une méthode pour gérer explicitement ce cas avec un argument supplémentaire. J'avoue, ce n'est pas propre.
Pour reprendre l'ECM de Jean-Marc Bourguet :
#include <iostream>
struct C { void f(int) { std::cout << "f(int)n"; }
C'est peut-être moins clair mais ça éviterait de définir une méthode supplémentaire.
Il faudrait que je teste...
JKB
-- Si votre demande me parvient sur carte perforée, je titiouaillerai très volontiers une réponse... => http://grincheux.de-charybde-en-scylla.fr
Le Fri, 27 Apr 2012 10:32:34 +0200,
Lucas Levrel <lucas.levrel@u-pec.fr> écrivait :
Le 26 avril 2012, JKB a écrit :
Sauf que même en forçant explicitement le type, le compilo n'en a
rien à faire. Avoir une méthode foo(const char *p) et une seconde
foo(int i) fait que foo(0) appelle la version cont char * même si je
prends la peine de coller foo((int) 0).
La solution pas élégante a été de rajouter une méthode pour
gérer explicitement ce cas avec un argument supplémentaire. J'avoue,
ce n'est pas propre.
Pour reprendre l'ECM de Jean-Marc Bourguet :
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
Le Fri, 27 Apr 2012 10:32:34 +0200, Lucas Levrel écrivait :
Le 26 avril 2012, JKB a écrit :
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char * même si je prends la peine de coller foo((int) 0). La solution pas élégante a été de rajouter une méthode pour gérer explicitement ce cas avec un argument supplémentaire. J'avoue, ce n'est pas propre.
Pour reprendre l'ECM de Jean-Marc Bourguet :
#include <iostream>
struct C { void f(int) { std::cout << "f(int)n"; }
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char *
Etrange.
même si je prends la peine de coller foo((int) 0).
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et
savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt
de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0,
je me demande si tu n'as pas trouve quelque chose de conforme, ou meme
de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour
eviter certains problemes, mais NULL ne peut pas -- encore? -- etre
definit comme nullptr). Il y a des consequences "interessantes" avec la
surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a
rien à faire. Avoir une méthode foo(const char *p) et une seconde
foo(int i) fait que foo(0) appelle la version cont char *
Etrange.
même si je
prends la peine de coller foo((int) 0).
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char *
Etrange.
même si je prends la peine de coller foo((int) 0).