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

C# Discussion :

Mauvaise approche vis à vis d'une classe (erreur de logique) [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 23
    Points
    23
    Par défaut Mauvaise approche vis à vis d'une classe (erreur de logique)
    Je bute sur un problème lié à une classe dont je n'arrive pas à trouver le solution seul.

    Voici ce probleme :

    Prologue :
    - J'ai toujours bossé sur des langages à programmation fonctionnel, j'ai encore de grosses lacunes sur la POO actuellement.
    - Je suis client d'une API.
    - La classe qui me pose problème fait parti d'une bibliothèque de classe de cette api.
    - La classe est publique.
    - Cette classe se nomme PlayerInfo, elle recense des données et des méthodes relatives à l'objet représentant le joueur. Le constructeur de cette classe a 3 paramètres obligatoires.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public PlayerInfo(string p_playername, NetConnection p_peer, Vector3 p_position)
    Mon objectif est le suivant :

    J'ai besoin d'ajouter de nouvelles variables dont les valeurs sont propres à chaque joueur, je pense naturellement à :

    - Ajouter des variables à cette classe.
    - Ajouter des methodes get / set pour travailler sur ces variables ajoutés.


    Dans un premier temps, je pense à une extension, seulement, j'ai besoin d'incorporer de nouvelles variables qui vont être encapsulé dans l'objet, ce n'est donc pas possible (il me semble).

    Je pense donc à créer une nouvelle classe qui hérite de celle ci, seulement je bute sur ce problème :

    - Il y a instanciation de la classe mère quand un client se connecte au serveur, je ne peux rien modifier à ce niveau, je n'y ai pas accès. Si c'est pour avoir une instance mère et une instance fille en même temps, ça me semble bien inutile. Je ne serais de toute facon pas en mesure d'instancier avec les paramètres obligatoires demandés.

    La solution n'est surement pas dans l'héritage du coup (ou alors ma vision est totalement faussée), mais je n'arrive pas à trouver le bon cheminement pour planifier mon objectif correctement, qui est d'encapsuler de nouvelles variables et méthodes en relation avec les instances de cette classe.

  2. #2
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Faire de l'héritage est un peu compliqué pour un débutant.
    Pourquoi ne pas simplement faire une classe qui contient un PlayerInfo ?

  3. #3
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par BenBout62 Voir le message
    Je pense donc à créer une nouvelle classe qui hérite de celle ci, seulement je bute sur ce problème :

    - Il y a instanciation de la classe mère quand un client se connecte au serveur, je ne peux rien modifier à ce niveau, je n'y ai pas accès. Si c'est pour avoir une instance mère et une instance fille en même temps, ça me semble bien inutile. Je ne serais de toute facon pas en mesure d'instancier avec les paramètres obligatoires demandés.
    Tu es obligé d'instancier ta classe mère dans ta classe fille, à condition que la classe mère n'ai pas de constructeur par défaut. Pour quelle raison n'es-tu pas en mesure d'instancier la classe mère? En théorie tu devrais, dans ta classe fille, avoir un constructeur correspondant aux paramètres de ta classe mère ou instancier ta classe mère avec des valeurs par défaut.

    Après, la solution entre l'héritage ou la composition c'est à toi de voir. Tu devrais pouvoir arriver au même résultat avec les deux méthodes, mais conceptuellement parlant ce sont deux choses très différentes.

    Ex :
    Une classe Fille et une classe Garçon peuvent hériter d'une classe Humain (en effet, ce sont tous deux des humains, mais avec quelques particularités). A l'inverse, il est difficile de dire qu'une Fille ou un Garçon sont composés d'un Humain...

  4. #4
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    C'est effectivement une situation assez délicate. Sans savoir ce que tu peux faire ou ne peux pas faire exactement, il est difficile de pouvoir te dire si une ou plusieurs possibilités existe(nt) et si oui laquelle te conseiller.

    Pour reprendre sur la notion d'héritage. C'est effectivement dommage d'avoir à la fois une instance de la classe mère (créé automatiquement à la connexion) et une instance de la classe fille. Maintenant, il y a des cas où cela serait la seule possibilité simple. Par exemple, un événement dont l'un des paramètres passé sera un objet de type PlayerInfo. Si ton gestionnaire à besoin des données que tu rajoutes (donc d'une instance de la classe fille), l'héritage est la seule solution simple.

    Maintenant, peut être que la composition est tout à fait envisageable. Là, tu peux encapsuler tes variables sans aucun soucis et manipuler ton enveloppe quand tu en as besoin. Et si tu as besoin de l'instance de PlayerInfo, tu peux toujours avoir une propriété qui te permette d'y accéder. Le hic, c'est que ce n'est pas toujours possible (cas ci-dessus).

    Une dernière possibilité que je vois (mais que je ne conseille qu'en dernier recours), c'est d'utiliser des méthodes d'extension (tu peux ainsi enrichir l'API de ta classe PlayerInfo) accompagnées d'un Dictionnary<PlayerInfo, PlayerInfoData> statique, qui te permette de stocker les variables en plus pour une instance de PlayerInfo. Ainsi, si tu as besoin d'accéder à tes variables supplémentaires, il te suffit d'utiliser le dictionnaire avec l'objet courant. C'est moche, mais c'est une possibilité. C'est moche car d'une part, on brise l'encapsulation car toutes les données pour un objet ne sont pas au même endroit. Ensuite, cela peut soulever également son lot de problème, notamment les accès concurrentiels, la gestion de la mémoire, etc...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Dans un premier temps, je pense à une extension, seulement, j'ai besoin d'incorporer de nouvelles variables qui vont être encapsulé dans l'objet, ce n'est donc pas possible (il me semble).
    Oui, tout à fait.

    L'héritage est le plus simple et propre pour ton cas.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // Ceci est ta classe de base
    public class PlayerInfo
    {
        public PlayerInfo(string p_playername, NetConnection p_peer, Vector3 p_position)
        { }
    }
     
    // Ceci est ta nouvelle classe, hérité de la classe de base
    public class PlayerInfoExtend : PlayerInfo
    {
        private string var;
        public string Var { get; set; }
     
        public PlayerInfoExtend(string p_playername, NetConnection p_peer, Vector3 p_position) : base(p_playername, p_peer, p_position)
        {
            Var = "vide";
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PlayerInfo pi = new PlayerInfo("", new NetConnection(), new Vector3());
    PlayerInfoExtend pie = new PlayerInfoExtend("", new NetConnection(), new Vector3());
    pie.Var = "valeur";

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par dorinf Voir le message
    C'est effectivement une situation assez délicate. Sans savoir ce que tu peux faire ou ne peux pas faire exactement, il est difficile de pouvoir te dire si une ou plusieurs possibilités existe(nt) et si oui laquelle te conseiller.

    Pour reprendre sur la notion d'héritage. C'est effectivement dommage d'avoir à la fois une instance de la classe mère (créé automatiquement à la connexion) et une instance de la classe fille. Maintenant, il y a des cas où cela serait la seule possibilité simple.
    Exactement, c'est pour cela que je bute, le fait que cette classe soit instancié dans une partie du programme qui ne m'est pas accessible (surement durant la request connect) et qui m'empeche de la remplacer directement par la classe fille. Je ne suis d'ailleurs pas encore hyper à l'aise avec certains paradigmes objet, du coup, cette situation plutot spéciale me perturbe pas mal dans mon raisonnement et dans le choix le plus pertinent à suivre vis à vis de l'objectif.



    Citation Envoyé par dorinf Voir le message
    Maintenant, peut être que la composition est tout à fait envisageable. Là, tu peux encapsuler tes variables sans aucun soucis et manipuler ton enveloppe quand tu en as besoin. Et si tu as besoin de l'instance de PlayerInfo, tu peux toujours avoir une propriété qui te permette d'y accéder. Le hic, c'est que ce n'est pas toujours possible (cas ci-dessus).

    Une dernière possibilité que je vois (mais que je ne conseille qu'en dernier recours), c'est d'utiliser des méthodes d'extension (tu peux ainsi enrichir l'API de ta classe PlayerInfo) accompagnées d'un Dictionnary<PlayerInfo, PlayerInfoData> statique, qui te permette de stocker les variables en plus pour une instance de PlayerInfo. Ainsi, si tu as besoin d'accéder à tes variables supplémentaires, il te suffit d'utiliser le dictionnaire avec l'objet courant. C'est moche, mais c'est une possibilité. C'est moche car d'une part, on brise l'encapsulation car toutes les données pour un objet ne sont pas au même endroit. Ensuite, cela peut soulever également son lot de problème, notamment les accès concurrentiels, la gestion de la mémoire, etc...
    J'envisageais également de partir sur la dernière possibilité, puis je me suis dit que ce n'était pas forcément la bonne solution. Ca brise l'encapsulation, dans cette hypothèse je pensais aussi à utiliser un dictionnaire mais je me suis dit que c'est tellement bete d'avoir une classe playerinfo avec des variables encapsulées comme il se doit et de devoir faire une extension sous cette forme avec des variables qui vont etre stockées ailleurs, d'autant plus dans un dictionnaire qui pour le coup n'est surement pas ce qu'il y a de plus rapide, que c'était vraiment pas du tout rentable par rapport à ces variables qui vont être assuremment les plus lus / écrites / réécrites de toutes celles que j'ai à manipuler pour mon programme.

    J'ai vaguement abordé le theme de la composition dans mes cours de génie logiciel, malheureusement niveau pratique c'est quelque chose que je n'ai pas encore abordé (c# étant après python le deuxième langage sur lequel je me familiarise aux paradigmes objet). Si vous pouviez me conseiller, me donner un modele ou un schéma à suivre, ou tout exemple pertinent, ce serait vraiment sympa de votre part. Après, si j'ai toujours besoin de renseigner l'un des 3 paramètres de la classe playerinfo, c'est foutu ce sera impossible (ce qui va être le cas il me semble pour une compo).
    Citation Envoyé par ericlm128 Voir le message
    Oui, tout à fait.

    L'héritage est le plus simple et propre pour ton cas.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // Ceci est ta classe de base
    public class PlayerInfo
    {
        public PlayerInfo(string p_playername, NetConnection p_peer, Vector3 p_position)
        { }
    }
     
    // Ceci est ta nouvelle classe, hérité de la classe de base
    public class PlayerInfoExtend : PlayerInfo
    {
        private string var;
        public string Var { get; set; }
     
        public PlayerInfoExtend(string p_playername, NetConnection p_peer, Vector3 p_position) : base(p_playername, p_peer, p_position)
        {
            Var = "vide";
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PlayerInfo pi = new PlayerInfo("", new NetConnection(), new Vector3());
    PlayerInfoExtend pie = new PlayerInfoExtend("", new NetConnection(), new Vector3());
    pie.Var = "valeur";
    Merci beaucoup Eric, malheureusement cette classe héritée necessite de pouvoir renseigner les 3 paramètres obligatoires, ce que je ne suis pas en mesure de pouvoir faire, ce type de données ne m'étant pas accessible (notamment pour la partie Network). Nous, on a accès a une callback overridé qui se nomme OnPlayerConnect et qui prend déja en parametre un objet courant de PlayerInfo. Donc toute la partie d'instantiation de PlayerInfo se fait en amont dans un evenement dont nous n'avons pas accès, avec des pamètres de construction qui ne nous sont pas familiers. Je ne sais pas d'ailleurs pourquoi le développeur de l'api a laissé le contructeur accessible à l'instanciation pour nous client, Je vais tout de meme contacter le développeur principal de l'api pour plus de renseignement, car il est possible que quelque chose m'échappe à ce niveau.

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    D'accord je comprend mieux la problématique, le fait que tu n'ai pas accès à l'instanciation de la classe est un vrai problème.

    Est tu sur que la classe PlayerInfo n'est pas déclaré 'partial' ?
    https://msdn.microsoft.com/fr-fr/library/wa80x488.aspx

    Quelle lien/relation y a t'il entre la classe PlayerInfo et les informations que tu souhaitent ajouter ?

  8. #8
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Est tu sur que la classe PlayerInfo n'est pas déclaré 'partial' ?
    Cela ne lui serait malheureusement d'aucune utilité ici. Le concept de classe partielle n'est valide qu'au sein d'une assembly. Il n'est pas possible de définir une classe partielle sur plusieurs assembly. Dans la mesure où il n'a pas les sources, on peut déjà en déduire que cela sera dans deux assembly différents.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Bonjour,

    Ce que je ne comprend pas c'est que tu dis ne pas être capable d'instancier la classe en question. Si tu ne peut pas l'instancier, tu ne peux donc pas l'utiliser et ce, même avant de parler d'héritage ou de composition... Non?

  10. #10
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Bonjour,

    Ce que je ne comprend pas c'est que tu dis ne pas être capable d'instancier la classe en question. Si tu ne peut pas l'instancier, tu ne peux donc pas l'utiliser et ce, même avant de parler d'héritage ou de composition... Non?
    Il a déjà répondu à cette question dans un message précédent.

    Citation Envoyé par BenBout62
    Merci beaucoup Eric, malheureusement cette classe héritée necessite de pouvoir renseigner les 3 paramètres obligatoires, ce que je ne suis pas en mesure de pouvoir faire, ce type de données ne m'étant pas accessible (notamment pour la partie Network). Nous, on a accès a une callback overridé qui se nomme OnPlayerConnect et qui prend déja en parametre un objet courant de PlayerInfo. Donc toute la partie d'instantiation de PlayerInfo se fait en amont dans un evenement dont nous n'avons pas accès, avec des pamètres de construction qui ne nous sont pas familiers.
    Il ne fait que récupérer une instance existante via un callback. L'instanciation est réalisée via un moteur interne auquel il n'a pas accès.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par dorinf Voir le message
    Il ne fait que récupérer une instance existante via un callback. L'instanciation est réalisée via un moteur interne auquel il n'a pas accès.
    Ah ok, je n'avais pas compris, désolé. Dans ce cas l'héritage semble compliqué. En revanche la composition ne devrait pas poser de problème.

  12. #12
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Citation Envoyé par dorinf Voir le message
    Cela ne lui serait malheureusement d'aucune utilité ici. Le concept de classe partielle n'est valide qu'au sein d'une assembly. Il n'est pas possible de définir une classe partielle sur plusieurs assembly. Dans la mesure où il n'a pas les sources, on peut déjà en déduire que cela sera dans deux assembly différents.
    Hum pas sur, je m'explique.
    Sur certaines classes de base j'ai déjà reproduit le namespace de la classe afin de pouvoir l'étendre avec 'partial'.
    Je dit juste, à voir.

  13. #13
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Hum pas sur, je m'explique.
    Sur certaines classes de base j'ai déjà reproduit le namespace de la classe afin de pouvoir l'étendre avec 'partial'.
    Je dit juste, à voir.
    Si j'essai d'étendre une classe partial défini dans un autre assembly, voici l'erreur que j'obtiens lorsque j'essai de l'utiliser :
    Le type 'Class1' existe dans 'Partial1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' et 'Partial1Extended, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
    Et c'est tout à fait logique, car une classe partielle permet de découper la définition d'une classe sur plusieurs fichiers. Cela permet de mettre à jour chaque partie indépendamment (très utile dans le cas où une partie de la classe est générée automatiquement ! Et c'est d'ailleurs massivement utilisé sous Visual Studio dès lors que tu utilises des designer, que tu génères des classes à partir d'un schéma XML, etc...).

    Mais ce n'est en aucun cas un mécanisme pour étendre une classe déjà existante. Si tu me dis que tu as réussi, je serais très curieux d'avoir un exemple pour que tu puisses me montrer comment tu as fait.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  14. #14
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Effectivement je doit me tromper, je n'arrive pas à le reproduire.

    Merci à toi.

  15. #15
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Du coup l'encapsulation semble être la seule méthode viable.

    Peut être avec une conversion implicite de type pour facilité l'écriture de code ?
    Qu'en pensez vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        // Ceci est ta classe de base
        public class PlayerInfo
        {
            public PlayerInfo(string p_playername, NetConnection p_peer, Vector3 p_position)
            { }
        }
     
        // Ceci est ta classe d'extension
        public class PlayerInfoExtend
        {
            // Information complémentaire
            private string var;
            public string Var { get; set; }
     
            public PlayerInfo PlayerInfo { get; }
            public PlayerInfoExtend(PlayerInfo PlayerInfo)
            {
                this.PlayerInfo = PlayerInfo;
            }
     
            public static implicit operator PlayerInfo(PlayerInfoExtend pie)
            {
                return pie.PlayerInfo;
            }
        }
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PlayerInfo pi = new PlayerInfo("nom", new NetConnection(), new Vector3());
    PlayerInfoExtend pie = new PlayerInfoExtend(pi);
    pie.Var = "valeur";
    PlayerInfo pi2 = pie;
    // Ou
    pi2 = pie.PlayerInfo;

  16. #16
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Du coup l'encapsulation semble être la seule méthode viable.

    Peut être avec une conversion implicite de type pour facilité l'écriture de code ?
    Qu'en pensez vous ?
    Je pense effectivement que c'est la seule solution.

    Eventuellement, s'il n'a qu'un objet PlayerInfo (par exemple, car c'est un callback), alors compléter la solution proposée par ericlm via l'utilisation d'un dictionnaire mentionnée précédemment (même si c'est moche), mais les contraintes techniques empêchent de faire ici autrement...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Le développeur de l'api m'a confirmé ce qui semblait être le cas, il a omit de masquer le constructeur de la class PlayerInfo (c'est une anecdote qui n'aura rien changé puisque c'était flagrant que le constructeur était inutilisable pour nous mais je tenais à vous apporter cette précision).

    Citation Envoyé par ericlm128 Voir le message
    Du coup l'encapsulation semble être la seule méthode viable.

    Peut être avec une conversion implicite de type pour facilité l'écriture de code ?
    Qu'en pensez vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        // Ceci est ta classe de base
        public class PlayerInfo
        {
            public PlayerInfo(string p_playername, NetConnection p_peer, Vector3 p_position)
            { }
        }
     
        // Ceci est ta classe d'extension
        public class PlayerInfoExtend
        {
            // Information complémentaire
            private string var;
            public string Var { get; set; }
     
            public PlayerInfo PlayerInfo { get; }
            public PlayerInfoExtend(PlayerInfo PlayerInfo)
            {
                this.PlayerInfo = PlayerInfo;
            }
     
            public static implicit operator PlayerInfo(PlayerInfoExtend pie)
            {
                return pie.PlayerInfo;
            }
        }
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PlayerInfo pi = new PlayerInfo("nom", new NetConnection(), new Vector3());
    PlayerInfoExtend pie = new PlayerInfoExtend(pi);
    pie.Var = "valeur";
    PlayerInfo pi2 = pie;
    // Ou
    pi2 = pie.PlayerInfo;
    Merci beaucoup pour le modele, c'est à peu près ce que je cherchais à faire.


    pi2 sert pour la conversion ?

    Je vais tester ca, merci à vous pour cette aide que vous m'avez apporté.

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

Discussions similaires

  1. Problème "position" vis à vis d'une macro
    Par albanalix dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/03/2015, 16h17
  2. texte en vis-à-vis d'une image ?
    Par le goss dans le forum Mise en forme
    Réponses: 2
    Dernier message: 29/01/2010, 14h30
  3. Réponses: 2
    Dernier message: 18/05/2004, 14h12
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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