 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michaël Delva Guest
|
Posted: Wed Mar 03, 2004 9:37 pm Post subject: Héritage ou pas? |
|
|
Bonsoir à tous,
j'ai la classe suivante, qui correspond à une séquence temporelle, qui
commence et finit à deux temps différents, et dont on peut calculer la
durée:
//-----------------------------------------------------------------------
struct SJ_Intervalle_Temps
{
LONGLONG debut,fin;
__fastcall SJ_Intervalle_Temps(const LONGLONG & debut_int,const
LONGLONG & fin_int) : debut(debut_int),fin(fin_int) {}
bool operator==(const SJ_Intervalle_Temps & compar) const
{ return (debut == compar.debut && fin == compar.fin); }
bool operator<(const SJ_Intervalle_Temps & compar) const
{ return (debut < compar.debut); }
inline LONGLONG __fastcall duree_intervalle() const
{ return fin - debut; }
};
//-----------------------------------------------------------------------
J'ai ensuite la classe suivante:
//-----------------------------------------------------------------------
class SJ_Sequence
{
public:
SJ_Intervalle_Temps debut_et_fin;
int index_action_fin,
index_action_debut;
//blablabla...
LONGLONG __fastcall DureeSequence() const
{ return debut_et_fin.duree_intervalle(); }
};
//-----------------------------------------------------------------------
J'ai dans cette classe un membre SJ_Intervalle_Temps qui me permet de
déterminer le début et la fin de cette séquence, et que j'utilise pour
calculer la durée de la séquence.
Mais ne serait-il pas plus simple d'utiliser l'héritage dans ce cas de
figure?
J'avoue (encore une fois ) ne pas être au point sur cette notion.
Si je déclare SJ_Sequence comme héritant de SJ_Intervalle_Temps, les
membres LONGLONG debut et fin seront accessibles depuis SJ_Sequence, c'est
bien ça?
Et donc il n'y aurait plus besoin de définir une fonction DureeSequence
dans SJ_Sequence, la fonction de la classe SJ_Intervalle_Temps étant là?
Je me trompe, ou bien je peux faire comme ça?
Merci d'avance!
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Wed Mar 03, 2004 9:57 pm Post subject: Re: Héritage ou pas? |
|
|
Michaël Delva wrote:
| Quote: | Bonsoir à tous,
Bonsoir.
j'ai la classe suivante, qui correspond à une séquence temporelle, qui
commence et finit à deux temps différents, et dont on peut calculer la
durée:
struct SJ_Intervalle_Temps
{
snip
};
J'ai ensuite la classe suivante:
class SJ_Sequence
{
public:
SJ_Intervalle_Temps debut_et_fin;
snip
};
J'ai dans cette classe un membre SJ_Intervalle_Temps qui me permet de
déterminer le début et la fin de cette séquence, et que j'utilise pour
calculer la durée de la séquence.
Mais ne serait-il pas plus simple d'utiliser l'héritage dans ce cas de
figure?
|
Sauf cas particulier, ce qui doit te décider à utiliser l'héritage public,
ce n'est pas la simplicité (apparente) de programmation, mais la sémantique
de tes objets : une classe B ne doit hériter d'une classe A que si
l'assertion "un objet B est un objet A" est vraie. On appelle ca le principe
de substitution de Liskov (LSP).
Je n'ai pas le contexte pour comprendre ce qu'est une "séquence" dans ton
cas, mais si une séquence *est* un intervalle de temps, alors utilise
l'héritage, sinon reste avec l'aggregation.
Arnaud
|
|
| Back to top |
|
 |
Michaël Delva Guest
|
Posted: Wed Mar 03, 2004 10:26 pm Post subject: Re: Héritage ou pas? |
|
|
"Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> wrote in
news:404654ab$0$28435$636a15ce (AT) news (DOT) free.fr:
| Quote: | Sauf cas particulier, ce qui doit te décider à utiliser l'héritage
public, ce n'est pas la simplicité (apparente) de programmation, mais
la sémantique de tes objets : une classe B ne doit hériter d'une
classe A que si l'assertion "un objet B est un objet A" est vraie. On
appelle ca le principe de substitution de Liskov (LSP).
|
Tu aurais des infos là dessus, url?
| Quote: | Je n'ai pas le contexte pour comprendre ce qu'est une "séquence" dans
ton cas, mais si une séquence *est* un intervalle de temps, alors
utilise l'héritage, sinon reste avec l'aggregation.
Et comme c'est le cas, j'ai "tenté" l'héritage, et ça marche... |
Je trouve ça plus simple comme ça en plus...
Merci de ta réponse!
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Mar 03, 2004 11:57 pm Post subject: Re: Héritage ou pas? |
|
|
Si tu écris
class D : public B ...
les codes ci-dessous doivent avoir un sens :
void f (B& b);
int main()
{
D d;
f (d);
}
int main()
{
B* ptr= new D;
}
--
|
|
| Back to top |
|
 |
Michaël Delva Guest
|
Posted: Thu Mar 04, 2004 12:22 am Post subject: Re: Héritage ou pas? |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> wrote in
news:74sc405qv27bfecrldfotqarlltqe6ai40 (AT) 4ax (DOT) com:
| Quote: | Si tu écris
class D : public B ...
les codes ci-dessous doivent avoir un sens :
void f (B& b);
int main()
{
D d;
f (d);
}
|
Ca, j'ai compris, c'est passer dans une fonction qui a comme argument la
classe "héritée" une instance de la classe qui "hérite"
| Quote: |
int main()
{
B* ptr= new D;
}
|
Là par contre je suis pas sûr: on peut instancier la classe "héritée" grâce
à la classe qui "hérite"?
PS: je ne pense pas que "héritée" et qui "hérite" soient les appellations
justes...
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Thu Mar 04, 2004 1:16 am Post subject: Re: Héritage ou pas? |
|
|
Dans news:Xns94A1EE70143A8zoubidamanhotmailcom (AT) 212 (DOT) 27.42.67, Michaël
Delva <zoubidaman (AT) hotmail (DOT) com> a écrit :
| Quote: | "Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> wrote in
news:404654ab$0$28435$636a15ce (AT) news (DOT) free.fr:
Sauf cas particulier, ce qui doit te décider à utiliser l'héritage
public, ce n'est pas la simplicité (apparente) de programmation,
mais la sémantique de tes objets : une classe B ne doit hériter
d'une classe A que si l'assertion "un objet B est un objet A" est
vraie. On appelle ca le principe de substitution de Liskov (LSP).
Tu aurais des infos là dessus, url?
|
Comme dirait je ne sais qui, Altavista est ton ami Mais
attention, Barbara (Liskov) n'a pas dit exactement ce que la
plupart des gens pensent qu'elle a dit ! Alors tu n'en tireras
probablement pas grand chose (en fait, elle a dit quelque chose
comme « If for each object o1 of type S there is an object o2 of
type T such that for all programs P defined in terms of T, the
behaviour of P is unchanged when o1 is substituted for o2 then S
is a subtype of T. »)...
| Quote: | Je n'ai pas le contexte pour comprendre ce qu'est une "séquence"
dans ton cas, mais si une séquence *est* un intervalle de temps,
alors utilise l'héritage, sinon reste avec l'aggregation.
Et comme c'est le cas, j'ai "tenté" l'héritage, et ça marche...
|
Ce n'est pas un critère suffisant. Si ça marche aussi bien sans
l'héritage, il vaut probablement mieux s'en passer.
| Quote: | Je trouve ça plus simple comme ça en plus...
|
Ce n'est pas un bon critère non plus :-(
D'après ce que je comprends de ton problème, une séquence
n'est pas une sorte d'intervalle de temps. Alors l'héritage
ne convient pas.
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Thu Mar 04, 2004 1:18 am Post subject: Re: Héritage ou pas? |
|
|
Dans news:Xns94A2E014FD1Czoubidamanhotmailcom (AT) 212 (DOT) 27.42.66, Michaël
Delva <zoubidaman (AT) hotmail (DOT) com> a écrit :
| Quote: | Fabien LE LEZ <gramster (AT) gramster (DOT) com> wrote in
news:74sc405qv27bfecrldfotqarlltqe6ai40 (AT) 4ax (DOT) com:
int main()
{
B* ptr= new D;
}
Là par contre je suis pas sûr: on peut instancier la classe
"héritée" grâce à la classe qui "hérite"?
PS: je ne pense pas que "héritée" et qui "hérite" soient les
appellations justes...
|
B est la « classe de base ». D est la « classe dérivée ». Ce qui
explique les noms classiques B et D pour ce genre d'exemple...
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Mar 04, 2004 1:19 am Post subject: Re: Héritage ou pas? |
|
|
On 04 Mar 2004 00:22:27 GMT, "Michaël Delva" <zoubidaman (AT) hotmail (DOT) com>
wrote:
| Quote: | PS: je ne pense pas que "héritée" et qui "hérite" soient les appellations
justes...
|
Je confirme, on dit généralement "classe de base" (ici, B) et "classe
dérivée" (ici, D).
| Quote: | int main()
{
B* ptr= new D;
}
Là par contre je suis pas sûr: on peut instancier la classe "héritée" grâce
à la classe qui "hérite"?
|
Oui : un D* convient partout où un B* convient.
Si tu acceptes l'idée
void f (B& b);
D d;
f (d);
tu accepteras sans doute aussi
void f (B* b);
D d;
D* ptr_d= &d;
f (ptr_d);
Si tu remplaces "f" par "operator=", tu obtiens assez directement
B* ptr= new D;
--
;-)
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Mar 04, 2004 1:52 am Post subject: Re: Héritage ou pas? |
|
|
On Wed, 3 Mar 2004 20:16:02 -0500, "Michel Michaud" <mm (AT) gdzid (DOT) com>
wrote:
| Quote: | (en fait, elle a dit quelque chose
comme « If for each object o1 of type S there is an object o2 of
type T such that for all programs P defined in terms of T, the
behaviour of P is unchanged when o1 is substituted for o2 then S
is a subtype of T. »)
|
Houlà, ça devient compliqué, ça. J'ai peut-être mal compris le terme
"subtype". Est-ce un équivalent de "dérivée", ou totalement autre
chose.
Prenons un exemple :
class T
{
public: virtual string nom_du_type() { return "T"; }
...
};
class S : public T
{
public: virtual string nom_du_type() { return "S"; }
...
};
void P (T &t) { cout << t.nom_du_type() << endl; }
Soit un objet o1 de classe S. P(o1) affichera "S".
Quel que soit o2 de classe T, P(o2) affichera "T".
Donc, quel que soit le contenu de S et T par ailleurs, dériver S de T
n'est pas correct ?
--
;-)
|
|
| Back to top |
|
 |
Michaël Delva Guest
|
Posted: Thu Mar 04, 2004 9:31 am Post subject: Re: Héritage ou pas? |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote in news:orv1c.16653$qA2.876307
@news20.bellglobal.com:
| Quote: | Comme dirait je ne sais qui, Altavista est ton ami Mais
attention, Barbara (Liskov) n'a pas dit exactement ce que la
plupart des gens pensent qu'elle a dit ! Alors tu n'en tireras
probablement pas grand chose (en fait, elle a dit quelque chose
comme « If for each object o1 of type S there is an object o2 of
type T such that for all programs P defined in terms of T, the
behaviour of P is unchanged when o1 is substituted for o2 then S
is a subtype of T. »)...
|
Mouais, faudra que je relise ça moins fatigué ;-)
| Quote: | Je n'ai pas le contexte pour comprendre ce qu'est une "séquence"
dans ton cas, mais si une séquence *est* un intervalle de temps,
alors utilise l'héritage, sinon reste avec l'aggregation.
Et comme c'est le cas, j'ai "tenté" l'héritage, et ça marche...
Ce n'est pas un critère suffisant. Si ça marche aussi bien sans
l'héritage, il vaut probablement mieux s'en passer.
Je trouve ça plus simple comme ça en plus...
Ce n'est pas un bon critère non plus :-(
D'après ce que je comprends de ton problème, une séquence
n'est pas une sorte d'intervalle de temps. Alors l'héritage
ne convient pas.
|
Ben c'est quand même le cas, une séquence est un intervalle de temps...
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Thu Mar 04, 2004 10:29 am Post subject: Re: Héritage ou pas? |
|
|
"Michaël Delva" <zoubidaman (AT) hotmail (DOT) com> wrote
| Quote: | "Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> wrote in
news:404654ab$0$28435$636a15ce (AT) news (DOT) free.fr:
Sauf cas particulier, ce qui doit te décider à utiliser l'héritage
public, ce n'est pas la simplicité (apparente) de programmation, mais
la sémantique de tes objets : une classe B ne doit hériter d'une
classe A que si l'assertion "un objet B est un objet A" est vraie. On
appelle ca le principe de substitution de Liskov (LSP).
Tu aurais des infos là dessus, url?
Google ou n'importe quel bouqin de conception objet. |
| Quote: |
Je n'ai pas le contexte pour comprendre ce qu'est une "séquence" dans
ton cas, mais si une séquence *est* un intervalle de temps, alors
utilise l'héritage, sinon reste avec l'aggregation.
Et comme c'est le cas,
Ah bon? Une séquence est un intervalle de temps? Ca représnte quoi une |
séquence exactement?
| Quote: | Je trouve ça plus simple comme ça en plus...
Mauvaise raison : La question est de savoir si ca a un sens par |
rapport à ta modélisation objet.
Arnaud
|
|
| Back to top |
|
 |
Michaël Delva Guest
|
Posted: Thu Mar 04, 2004 11:35 am Post subject: Re: Héritage ou pas? |
|
|
[email]adebaene (AT) club-internet (DOT) fr[/email] (Arnaud Debaene) wrote in
news:16a4a8c7.0403040229.54e33375 (AT) posting (DOT) google.com:
| Quote: | Tu aurais des infos là dessus, url?
Google ou n'importe quel bouqin de conception objet.
|
Cet après-midi...
| Quote: |
Je n'ai pas le contexte pour comprendre ce qu'est une "séquence"
dans ton cas, mais si une séquence *est* un intervalle de temps,
alors utilise l'héritage, sinon reste avec l'aggregation.
Et comme c'est le cas,
Ah bon? Une séquence est un intervalle de temps? Ca représnte quoi une
séquence exactement?
|
Une séquence correspond à la durée pendant laquelle une équipe de basket
défend ou attaque lors d'un match... Il y a donc un début (une remise en
jeu, un rebond...) et une fin (tir, balle perdue...), et donc une durée.
| Quote: | Je trouve ça plus simple comme ça en plus...
Mauvaise raison : La question est de savoir si ca a un sens par
rapport à ta modélisation objet.
|
Tu es le deuxième à me le dire. Ca me semblait en être une ;-)
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Thu Mar 04, 2004 12:43 pm Post subject: Re: Héritage ou pas? |
|
|
Dans news:Xns94A2800B5A525zoubidamanhotmailcom (AT) 212 (DOT) 27.42.67, Michaël
Delva <zoubidaman (AT) hotmail (DOT) com> a écrit :
| Quote: | Une séquence correspond à la durée pendant laquelle une équipe de
basket défend ou attaque lors d'un match... Il y a donc un début
(une remise en jeu, un rebond...) et une fin (tir, balle
perdue...), et donc une durée.
|
Donc une séquence « a » une durée. Elle « n'est pas » une durée.
C'est la relation dite HAS-A, pour laquelle l'héritage public
n'est pas approprié. Il faut la relation IS-A pour la relation.
Prends cet exemple : que feras-tu si tu veux un jour conserver
la durée en deux valeurs, une pour la détention du ballon par
chaque équipe ?
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Thu Mar 04, 2004 12:45 pm Post subject: Re: Héritage ou pas? |
|
|
Dans news:gwF1c.17010$qA2.977909 (AT) news20 (DOT) bellglobal.com, Michel
Michaud <mm (AT) gdzid (DOT) com> a écrit :
| Quote: | C'est la relation dite HAS-A, pour laquelle l'héritage public
n'est pas approprié. Il faut la relation IS-A pour la relation.
|
Il faut la relation IS-A pour « l'héritage public ».
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Michaël Delva Guest
|
Posted: Thu Mar 04, 2004 1:13 pm Post subject: Re: Héritage ou pas? |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote in news:gwF1c.17010$qA2.977909
@news20.bellglobal.com:
| Quote: | Donc une séquence « a » une durée. Elle « n'est pas » une durée.
|
Ben c'est aussi une durée il me semble... Je trouve que l'on peut dire les
deux...
| Quote: | C'est la relation dite HAS-A, pour laquelle l'héritage public
n'est pas approprié. Il faut la relation IS-A pour la relation.
Prends cet exemple : que feras-tu si tu veux un jour conserver
la durée en deux valeurs, une pour la détention du ballon par
chaque équipe ?
|
Excuse moi, mais je suis pas sûr d'avoir bien compris...
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|