question de design

question de design - C++ - Programmation

Marsh Posté le 31-07-2010 à 11:19:04    

bonjour à tous,
je me pose une question de design, j'en ai jamais trop fait alors ma question est peut être débile  :pt1cable:

 

Toujours est il, j'ai plusieurs classes qui peuvent mettre à jours des types particuliers (du style price, memo ... comme int et double sont des types). De plus, j'ai plusieurs classes qui peuvent mettre à jours ces types, mais pour d'autres ça n'a aucun sens de le faire :

 
Code :
  1. class Objet;
  2. class A, B, C; //A,B et C dérivent de la classe Objet
  3. A a, B b, C c;
  4. a->setPrice(12);
  5. b->setPrice(40); //les methodes de A et B ont le même code
  6. c->setPrice(45); //la ça n'aurait pas de sens de le faire...
 


j'ai pensé mettre la méthode virtuelle setPrice() dans la classe Objet mais du coup un objet de type C pourrait s'en servir.

 

Ou sinon un truc - peut être crado - du style je fais une methode _setPrice() en protected, dans Objet, qui contient le code, et une autre public "virtual setPrice()" qui ne fait rien. Et la classe qui dérive et veut ré-implémenter fera un truc du style :

 
Code :
  1. void A::setPrice(Price price)
  2. {
  3.   return _setPrice(price);
  4. }
 

mais c'est bof, non ?

 

En fait, je voudrait faire de l'héritage "sélectif" ... ce serait quoi la meilleure manière de faire ? et la plus simple.

 

merci!


Message édité par in_your_phion le 31-07-2010 à 11:23:59
Reply

Marsh Posté le 31-07-2010 à 11:19:04   

Reply

Marsh Posté le 31-07-2010 à 11:26:28    

arrete d'heriter de Object surtout, tu viole salement le Principe de Substitution de Liskov:

 

http://cpp.developpez.com/faq/cpp/ [...] ritage_lsp
http://en.wikipedia.org/wiki/Lisko [...] _principle
http://fr.wikipedia.org/wiki/Princ [...] _de_Liskov

 

si c->setPrice n'a pas de sens, C ne devrait pas exposer cette méthode.
Revoit ta hiérarchie de classe.

 

Y a que moi qui enseigne ça à la Fac ou bien ? C'ets le niveau 1 de l'OOP quoi :€


Message édité par Joel F le 31-07-2010 à 11:27:14
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed