IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 12
    Par défaut Comment accéder à une propriété d'une classe enfant dont la propriété ne fait pas partie de l'héritage ?
    Bonjour à tous je me demande comment accéder à la propriété (get ; set) d'une classe enfant en polymorphisme. Voilà j'explique ... Je suis entrain de faire un petit jeu sur monogame en c#. J'ai la classe GameObject qui à ses propriétés et une classe bouclier qui possède toute les propriétés de la classe GameObject sauf une qui est l'énergie du bouclier. Donc dans mon main j'ai un GameObject bouclier qui est également un bouclier puisque
    bouclier = new Bouclier();. Mais au niveau de mon affichage j'aimerais pouvoir afficher la quantité d'énergie restante du dit bouclier. Mais je ne peux pas utiliser bouclier.Energie puisqu'il n'est pas accessible. Dans ma classe le champs energie est private et l'accesseur public. Je me demande donc comment y accéder à partir du main ??

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (lavariable is Bouclier) // test du type
    {
      var energie = ((Bouclier)lavariable).Energie; // cast explicite
      //
    }
    il y a des patterns plus efficaces pour faire du spécifique sans le savoir, mais bon ce code est simple et reste propre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Question performance, "as" n'est-il pas plus performant que le cast ?

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (lavariable is Bouclier) // test du type
    {
      var energie = (lavariable as Bouclier).Energie; // pas de création d'un nouveau handle
      //
    }

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Question performance, "as" n'est-il pas plus performant que le cast ?

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (lavariable is Bouclier) // test du type
    {
      var energie = (lavariable as Bouclier).Energie; // pas de création d'un nouveau handle
      //
    }
    Le "as" est moins performant puisqu'il refait implicitement un "is".

    Dans les docs Microsoft, ils conseillent de faire comme ceci puisque le "as" ne va affecter la variable que si le "is" renvoie true :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var bouclier = (lavariariable as bouclier);
    if (bouclier != null)
    {
         var energie = bouclier.Energie;
    }

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Dans ce cas... Ceci ?

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    var energie = (lavariable as Bouclier)?.Energie;

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    Sur le principe, oui.

    Même si personnellement, je ne suis pas fan de cette syntaxe car l’œil peut facilement manquer le point d'interrogation.

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Question performance, "as" n'est-il pas plus performant que le cast ?
    le mieux doit être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (variable is bouclier b) console.writeline(b.propriete)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    le mieux doit être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (variable is bouclier b) console.writeline(b.propriete)
    Ah oui c'est vrai que j'avais oublié cette évolution du is qui fait un as

  9. #9
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    le mieux doit être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (variable is bouclier b) console.writeline(b.propriete)
    Compile pas en 4.6.2...
    C'est aussi une nouveau du 4.7 ?

  10. #10
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par popo Voir le message
    Compile pas en 4.6.2...
    C'est aussi une nouveau du 4.7 ?
    Oui c'est un raccourci de 4.7

  11. #11
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Question performance, "as" n'est-il pas plus performant que le cast ?

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (lavariable is Bouclier) // test du type
    {
      var energie = (lavariable as Bouclier).Energie; // pas de création d'un nouveau handle
      //
    }
    Cela dépend complètement de la situation. Il serait intéressant de refaire des tests aujourd'hui (comme les compilateurs ont beaucoup évolué), mais caster un objet pour faire du downcasting est différent que caster un objet en int? par exemple.

    Dans le premier cas, l'usage de as était plus performant qu'un cast. Dans le second cas, l'usage du cast (associé à is) était plus performant car le compilateur pouvait éviter les opérations de box/unboxing.

    Quoi qu'il en soit, d'un point de vue performance, la cast avec as ou avec le nouveau pattern is de C# 7 sont équivalent en terme de performance.

  12. #12
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Quoi qu'il en soit, d'un point de vue performance, la cast avec as ou avec le nouveau pattern is de C# 7 sont équivalent en terme de performance.
    persuadé que ce n'était qu'un syntaxic sugar j'avais regardé l'IL généré de if (instance is type newvar) comparé à as et il y avait quelques lignes en moins avec le is qui créé une variable (en c# 7.3 il me semble)
    après je sais pas lire l'IL donc je pourrais pas dire la différence ^^
    et c'était peut etre l'utilisation que j'en faisais ensuite qui a pu amener une optimisation
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment accéder à une classe depuis un programme?
    Par KTARIK dans le forum Général Python
    Réponses: 1
    Dernier message: 02/06/2014, 16h48
  2. Réponses: 4
    Dernier message: 23/04/2010, 17h45
  3. Ouvrir une socket sur un PC qui ne fait pas partie du réseau local
    Par Poupinelelapin dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 03/04/2010, 23h16
  4. Réponses: 1
    Dernier message: 20/08/2009, 11h06
  5. [VB.Net] Comment accéder à une propriété de sous-classes ?
    Par druidev dans le forum Windows Forms
    Réponses: 13
    Dernier message: 05/09/2006, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo