Exception de Cast d'une classe parent en une classe dérivée

Résolu
tri_yann Messages postés 124 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 19 septembre 2013 - 19 sept. 2013 à 22:40
NHenry Messages postés 15090 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 6 novembre 2023 - 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

5 réponses

NHenry Messages postés 15090 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 6 novembre 2023 159
19 sept. 2013 à 23:08
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 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
0
NHenry Messages postés 15090 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 6 novembre 2023 159
20 sept. 2013 à 12:02
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
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15090 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 6 novembre 2023 159
20 sept. 2013 à 12:46
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.
0
Rejoignez-nous