OVH Cloud OVH Cloud

subclasse/superclasse

9 réponses
Avatar
Laurent Deniau
Quelques questions (philosophique?) qui me viennent a l'esprit:

Est-ce qu'une classe est une subclasse d'elle meme?
Est-ce qu'une classe est une super classe d'elle meme?

Vu maintenant du point pratique, si on avait deux fonctions pour
repondre a ces questions:

isSubClassOf (A, A) == true
isSuperClassOf(A, A) == true

seraient toujours vraies ou toujours fausses?

a+, ld.

9 réponses

Avatar
Fabien LE LEZ
On Wed, 21 Jul 2004 18:55:51 +0200, Laurent Deniau
:

Est-ce qu'une classe est une subclasse d'elle meme?
Est-ce qu'une classe est une super classe d'elle meme?


Pour les "subclasses" et "superclasses", je ne sais pas -- c'est le
genre de termes que je n'ai jamais rencontré en C++.

En C++ on parle plutôt de "classe de base" ou "classe dérivée", et ces
termes impliquent un héritage (donc une classe n'est pas dérivée
d'elle-même).



--
;-)

Avatar
Loïc Joly
Laurent Deniau wrote:

Quelques questions (philosophique?) qui me viennent a l'esprit:

Est-ce qu'une classe est une subclasse d'elle meme?
Est-ce qu'une classe est une super classe d'elle meme?

Vu maintenant du point pratique, si on avait deux fonctions pour
repondre a ces questions:

isSubClassOf (A, A) == true
isSuperClassOf(A, A) == true

seraient toujours vraies ou toujours fausses?


Contrairement à Fabien, je pense que la question n'est pas aussi simple.
Ca dépend si on est essentialiste ou existencialiste.

L'existentialiste ira voir la notion intrinsèque d'une classe de base et
dérivée, et répondra comme Fabien. Je ne reviens pas sur son argument.

L'essentialisme dira que ces notions ne se définissent que par leur
propriétés, et verra que A possède presque toutes les caractèristiques
que doivent possèder une classe de base de A, mais pas toutes. En
particulier, une classe de base B de A possède la propriété que toutes
ses fonctions private peuvent être appelées de B mais pas de A, ce qui
n'est pas le cas pour A=B.

La conclusion est la même, mais la démarche me semble plus productive.
Maintenant, pour ce qui est de savoir si ça sert à quelque chose...

--
Loïc

Avatar
Laurent Deniau
Loïc Joly wrote:
Laurent Deniau wrote:

Quelques questions (philosophique?) qui me viennent a l'esprit:

Est-ce qu'une classe est une subclasse d'elle meme?
Est-ce qu'une classe est une super classe d'elle meme?

Vu maintenant du point pratique, si on avait deux fonctions pour
repondre a ces questions:

isSubClassOf (A, A) == true
isSuperClassOf(A, A) == true

seraient toujours vraies ou toujours fausses?



Contrairement à Fabien, je pense que la question n'est pas aussi simple.
Ca dépend si on est essentialiste ou existencialiste.


Yep.

L'existentialiste ira voir la notion intrinsèque d'une classe de base et
dérivée, et répondra comme Fabien. Je ne reviens pas sur son argument.


Yep. D'ailleurs c'est pour cela que je n'ai pas employe base et derivee
car avec ce vocabulaire, il n'y a pas d'ambiguite.

L'essentialisme dira que ces notions ne se définissent que par leur
propriétés, et verra que A possède presque toutes les caractèristiques
que doivent possèder une classe de base de A, mais pas toutes. En
particulier, une classe de base B de A possède la propriété que toutes
ses fonctions private peuvent être appelées de B mais pas de A, ce qui
n'est pas le cas pour A=B.


Ca c'est l'aspect philosophique avec lequel j'adhere 100%.

Dans l'aspect pratique, quand on veut savoir si une classe est une
classe de base d'une autre classe, cela inclu souvent que l'on accepte
une "egalite" de classe.

Par exemple le code (fictif) suivant inclu l'egalite:

bool isSubClassOf(Class class, Class super)
{
while (class != super && class)
class = superOf(class);

return class == super && class;
}

Mais l'utilisation pratique d'un tel code implique souvent le besoin
d'inclure l'egalite. L'exclure complique passablement sont utilisation.

La conclusion est la même, mais la démarche me semble plus productive.
Maintenant, pour ce qui est de savoir si ça sert à quelque chose...


oui. par exemple l'implementation de catch ou de dynamic_cast sur
heritage simple en prenant Class ci-dessus comme etant par exemple un
pointeur de vtbl ou de typdeid.

a+, ld.


Avatar
Fabien LE LEZ
On Thu, 22 Jul 2004 10:11:49 +0200, Laurent Deniau
:

Ca c'est l'aspect philosophique avec lequel j'adhere 100%.


Donc, en gros, tu définis la relation "est une superclasse de" comme
une relation d'ordre,au sens mathématique du terme ?


--
;-)

Avatar
Laurent Deniau
Fabien LE LEZ wrote:
On Thu, 22 Jul 2004 10:11:49 +0200, Laurent Deniau
:


Ca c'est l'aspect philosophique avec lequel j'adhere 100%.



Donc, en gros, tu définis la relation "est une superclasse de" comme
une relation d'ordre,au sens mathématique du terme ?


Yep. Mais apres les reponses que j'ai eues, il semble que inclure
l'egalite ammene trop de confusion. J'ai donc ecarte ce cas.

a+, ld.


Avatar
Fabien LE LEZ
On Thu, 22 Jul 2004 16:49:06 +0200, Laurent Deniau
:

Yep. Mais apres les reponses que j'ai eues, il semble que inclure
l'egalite ammene trop de confusion. J'ai donc ecarte ce cas.


De toutes façons, ça reste de la métaphysique (ou de la linguistique).
Et tu peux très bien dire, au début d'un exposé :

"Définition : on dira ici qu'une "subclasse" (ou "épagneul breton")
d'une classe est une classe dérivée, ou elle-même".


--
;-)

Avatar
Falk Tannhäuser
Loïc Joly wrote:

L'essentialisme dira que ces notions ne se définissent que par leur
propriétés, et verra que A possède presque toutes les caractèristiques
que doivent possèder une classe de base de A, mais pas toutes. En
particulier, une classe de base B de A possède la propriété que toutes
ses fonctions private peuvent être appelées de B mais pas de A, ce qui
n'est pas le cas pour A=B.


Vu de l'extérieur, les fonctions 'private' sont inaccessibles, par contre
une fonction membre (ou amie) de la classe de base 'B' peut les appeler,
peu importe qu'elle opère sur une instance de la classe 'B' ou une instance
de la classe dérivée 'D'.
Dans le cas de la dérivation publique, les instances de la classe dérivée
peuvent apparaître partout où sont acceptées les instances de la classe
de base (parce que les conversions 'D*' vers 'B*' et 'D&' vers 'B&' sont
implicites et automatiques). Il appartient au concepteur de 'D' de s'assurer
que les fonctions membres de 'D' répondent à toutes les contraintes imposées
au niveau de 'B' (invariantes, pré- et postconditions) - c'est en gros le
principe de substituabilité (ça se dit ainsi en français ?) de Liskov.
En revanche, une classe peut toujours être substituée par elle-même -
c'est pour cela que je dirais que, dans la pratique, la relation
"_ est une subclasse de ou égale à _" est plus importante que la relation
"_ est une vraie subclasse de _".

Falk

Avatar
Vincent Lascaux
"Définition : on dira ici qu'une "subclasse" (ou "épagneul breton")
d'une classe est une classe dérivée, ou elle-même".


Le problème est qu'alors tu ne peux plus parler d'épagneul breton. Dans ce
cas, il faut ajouter "on dira qu'une casserole est un chien au pelage blanc
et orangé et à la queue écourtée".

--
Vincent

Avatar
Fabien LE LEZ
On Thu, 22 Jul 2004 23:54:42 +0100, "Vincent Lascaux"
:

Le problème est qu'alors tu ne peux plus parler d'épagneul breton.


Pas grave, on n'est pas sur fr.rec.jeux.nomic ici.


--
;-)