Exception de Cast d'une classe parent en une classe dérivée [Résolu]

Messages postés
124
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
19 septembre 2013
- - Dernière réponse : NHenry
Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
- 20 sept. 2013 à 12:46
Bonjour,

D'avance merci à ceux qui ou tenteront de m'aider.

J'ai construit une classe parent que j'appellerai "ClsPersonne".
Dans la classe ClsPersonne, j'ai une Shared Function qui renvoit une classe ClsPersonne.

Public Class ClsPersonne
Private pRein as string
Private pCoeur as Object
...

Public Shared Function GetPersonne (Anatomie as Object) as ClsPersonne
Dim Res as New ClsPersonne 
' code
Return Res
End Function

End Class


J'ai une classe dérivée "ClsHomme" qui hérite de la classe ClsPersonne contenant quelques propriétés supplémentaires.

Public Class ClsHomme
Inherits ClsPersonne
Private pSexe as Boolean

End Class


Dans une Function (extérieure aux classes) je voudrai récupérer un objet type ClsHomme en utilisant la méthode GetClsPersonne

Dim Raoul as ClsHomme = ClsPersonne.GetPersonne(Anatomie)


A l'exécution j'ai une exception "Impossible d'effectuer un cast de "ClsPersonne" en "ClsHomme".

Quelqu'un peut-il m'expliquer pourquoi le polymorphisme ne fonctionne pas dans mon cas ?
Et le cas échéant, la solution à mon problème ?

Salutations
Afficher la suite 

5 réponses

Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
137
0
Merci
Tu n'as pas bien compris la notion d'héritage :

Dans ton cas, ClsHomme dérive (ou hérite) de ClsPersonne

Donc, tu peux mettre un ClsHomme dans une variable de type ClsPersonne, mais pas l'inverse.

Tu peux faire :
MaVariablePersonne=MaVariableHomme
Mais pas
MaVariableHomme=MaVariablePersonne
0
Merci
Merci NHenry pour ta réponse.

J'ai bien senti dans mon cas qu'une classe parent ne peut pas être castée en class dérivée.

Mais malgré tout, j'ai besoin de savoir s'il y a moyen, par exemple en créant une fonction "Cast' de faire ce qui n'est pas possible.
Mon soucis est de ne pas dupliquer la fonction de la classe mère dans toutes les classes dérivées.

Par exemple :
Dim ObjHomme = ClsPersonne.Cast(ObjPersonne, pSexe:=True)


Cordialement
Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
137
0
Merci
Bonjour,

Si le type de l'objet retourné est un ClsHomme (même si la variable contenant est de type ClsPersonne) tu peux utiliser DirectCast.
0
Merci
NHenry,

J'ai la même exception avec le DirectCast. Je pense que cette méthode était utilisée implicitement.

J'ai opté pour l'abandon de l'héritage. j'ai modifié ma classe ClsHomme. Elle contient maintenant un objet ClsPersonne.
Je peux utiliser tout de même les méthodes de cet objet stocké dans ClsHomme via une propriété.

Merci beaucoup de ton aide.
Je reste sur ma faim tout de même. Pour moi un héritage de classes permettait de créer une classe dérivée "spécialisée" de la classe parent. Et dans mon cas je suis bloqué. Tant pis.

Cordialement
Yann
Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
137
0
Merci
Mon message était clair pourtant :

Function RetourneBonEnregistrement(ClasseDeBase As ClsPersonne, IsMale as Boolean) As ClsPersonne

If IsMale Then
Return New ClsHomme(...)
Else
Return New ClsFemme(...)
End If
End Function


Et plus loin :
Dim MonHomme As ClsHomme=DirectCast(RetourneBonEnregistrement(MaPersonne,True), ClsHomme)


Si ta fonction ne fait que (directement ou non) :
Return New ClsPersonne
C'est normal que ton cast échoue.