Deux objects héritant d'un même troisième, comment utiliser leurs différences

Résolu
ypelissier Messages postés 23 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 16 mai 2013 - 9 mai 2013 à 22:58
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 15 mai 2013 à 12:08
Bonsoir,
J'ai quelques rudiments pour faire de l'objet avec toute la panoplie de l'interface et de l'héritage, mais je suis confronté à une situation sur laquelle je bloque et un coup de pouce me serait bien utile.

Voilà le décore, j'ai deux objets Titi et Toto qui héritent de Tata. Ce-dernier implémente l'interface ITata.
Dans mon formulaire, j'ai une variable globale centrale de mon programme, mais au début de l'exécution, je ne sais pas si cela va être titi ou toto. Le choix se fait à l'aide d'un switch et j'ai le code suivant :
// Déclaration
ITata maos

private void Choisir()
{
switch (lenm_AOS)
{
case enum_ChoixObjet.Titi:
maos = new Titi();

maos.SpecifiqueTiti = LireDansFichierIni();

break;
case enum_ChoixObjet.Toto:
maos = new Toto();

maos.SpecifiqueToto();

break;
default:
Application.Exit();

return;
}
}


Vous l'avez compris, j'ai une erreur sur SpecifiqueTiti et SpecifiqueToto puisqu'ils ne sont pas dans l'interface ITata.

Of course, mais si je mets Titi maos, j'ai des soucis avec Toto et vice et versa.

Que me conseilleriez-vous pour m'en sortir ?

Merci

4 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
10 mai 2013 à 00:52
Un cast peut être?
		(Titi)maos.SpecifiqueTiti = LireDansFichierIni();



Whismeril
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
10 mai 2013 à 21:22
Salut,

A mon avis, ne déclares pas directement l'interface, mais l'objet qui l'implémente, en l'occurence Tata.

///ITata maos
Tata maos;

maos = new Titi(); // Ok puisque Titi dérive de Tata
maos.SpecifiqueTiti = LireDansFichierIni(); // pas besoin de cast

// Accès à l'interface, cast explicite
((Itata)maos).MethodeInterface();


bye...
3
ypelissier Messages postés 23 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 16 mai 2013
15 mai 2013 à 10:21
Bonjour,
Désolé pour cette réponse tardive, mais j'ai aussi profité de mon week-end

J'ai suivi vos conseil et retiré l'interface pour y mettre l'objet "père".
Et j'ai forcé avec le cast à chaque fois que je souhaite faire une spécificité.

Mon code devient le suivant :
// Déclaration
Tata maos // Directement l'objet mère et pas son interface

private void Choisir()
{
switch (lenm_AOS)
{
case enum_ChoixObjet.Titi:
maos = new Titi();

((Titi)maos).SpecifiqueTiti = LireDansFichierIni(); // @yann_lo_san : Il faut quand même forcer avec le cast sinon ça ne compile pas

break;
case enum_ChoixObjet.Toto:
maos = new Toto();

((Toto)maos).SpecifiqueToto(); // Attention à bien mettre les doubles parenthèses pour forcer avec le cast

break;
default:
Application.Exit();

return;
}
}


Tout fonctionne impeccablement maintenant, je vais pouvoir terminer mon projet.


Merci beaucoup les gars.
3
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
15 mai 2013 à 12:08
Avec plaisir


Whismeril
0
Rejoignez-nous