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

XNA/Monogame Discussion :

champs avec get et set avec impossibilité d'ecrire sur le champs


Sujet :

XNA/Monogame

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 49
    Points : 15
    Points
    15
    Par défaut champs avec get et set avec impossibilité d'ecrire sur le champs
    Bonjour tout le monde ,
    J'ai un petit probléme de programmation d'un petit exemple :
    En faite j'ai une classe Sprite ,
    - avec un champ privé color de type Color
    -et un champ public pour Color pour la lecture et l'écriture dans le champ précédant (avec get et set)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            Color color = Color.White;
     
            public Color Color
            {
                get { return color; }
                set { color = value; }
            }
    -et une autre classe Batte qui hérite de la classe Sprite
    alors voila mon probléme ,dans une méthode de la classe fille Batte dont l'objectif de changer de couleur (exemple très connu ) lorsque je voudrais lire le champ Color précédant pour comparaison dans if ça va ça marche très bien mais lorsque je voudrais écrire sur le champ (par exemple en incrémentant Color.R++) s'affiche une erreur comme quoi je ne peux pas al modifier car elle n'est pas une variable .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (Color.R < nextcolor.R)
                    Color.R++ ;
    svp d'ou vient l'erreur merci infiniment et bonne journée .

  2. #2
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Ton problème n'a pas grand chose à voir avec XNA : cela se produit à chaque fois que tu utiliseras une struct en tant que propriété : il ne te sera pas permis d'en modifier les membres.

    Par contre tu peux réaffecter la propriété :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Color = new Color(Color.R+1 , Color.G, Color.B);
    Le mieux étant de directement définir dans la classe de base la propriété que tu veux pouvoir modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public byte Red
    {
                get { return color.R; }
                set { color.R = value; }
    }
    pour ainsi la modifier à ta guise dans la classe fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (Color.R < nextcolor.R)
                    Red++ ;
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 49
    Points : 15
    Points
    15
    Par défaut
    Merci infiniment MoDDiB ,
    mais j'ai une petite question dans ce cas ,
    pourquoi on a dans ce cas un set dans le champs color s'il n'a en faite aucune utilité et si on ne pourra pas le modifier et écrire dessus .(je précise que c'est un exemple pris et tiré avec une petite modification d'un livre célèbre de xna ).

  4. #4
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Citation Envoyé par meetsmile Voir le message
    Merci infiniment MoDDiB ,
    mais j'ai une petite question dans ce cas ,
    pourquoi on a dans ce cas un set dans le champs color s'il n'a en faite aucune utilité et si on ne pourra pas le modifier et écrire dessus .(je précise que c'est un exemple pris et tiré avec une petite modification d'un livre célèbre de xna ).
    Sisi tu peux le modifier comme je le montre dans le premier exemple, certes c'est gênant de tout reconstruire mais ça reste possible.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Citation Envoyé par MoDDiB Voir le message
    Ton problème n'a pas grand chose à voir avec XNA : cela se produit à chaque fois que tu utiliseras une struct en tant que propriété : il ne te sera pas permis d'en modifier les membres.
    Salut, je ne comprends pas ce que tu veux dire par-là, peux-tu expliciter ?

    @meetsmile :
    Pourquoi tu ne déclares pas simplement Color color en protected, tu pourras y accéder directement depuis tes classes filles. Et je ne comprends pas non plus l'intérêt des getters-setters dans ton cas.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    struct Color        {
           int R, G, B, A;
    };
     
     
    class Spr	{
    public:
    	Spr() {
    		this->color.R = 0;
    		this->color.G = 0;
    		this->color.B = 0;
    		this->color.A = 255;
    	} 
     
    	Color getColor() const	{
    	  return this->color;
    	} 
     
    protected:
        Color color;
    };
     
     
    class BigSpr : Spr	{
    public:
    	BigSpr() {
    		std::cout << this->color.R << "\r\n";
    		this->color.R++;
    		std::cout << this->color.R << "\r\n";
    	} 
    };
     
     
    int main(int argc, char *argv[])   {
     
        BigSpr* spr = new BigSpr();
        delete spr;
    }
    [edit]
    Oops, désolé pas fait attention que c'était du XNA, je laisse quand même le post car il me semble que le mieux est quand même de gérer cela avec protected.
    Vive les roues en pierre

  6. #6
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Salut, je ne comprends pas ce que tu veux dire par-là, peux-tu expliciter ?
    Prenons cette struct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Position2D
    {
     public int X;
     public int Y;
    }
    Si ma struct deviens une propriété d'une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Entity
    {
     public Position2D Position 
     { get ; set ; }
    }
    C# ne voudra pas compiler ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Entity entity = new Entity();
    entity.Position.X = 5;
    Car au final ce que me retourne Position est une copie de valeur et non une référence, il n'y aurait aucun intérêt à le modifier....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pourquoi tu ne déclares pas simplement Color color en protected, tu pourras y accéder directement depuis tes classes filles. Et je ne comprends pas non plus l'intérêt des getters-setters dans ton cas.
    Normalement si l'on respecte l'encapsulation au maximum on évite de passer directement un champ en protected.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Ok, merci pour les infos, je comprends
    Par contre, je ne suis pas d'accord pour l'encapsulation, protected sert justement à cela. Je t'explique pas la pile d'appel si tu ne l'utilises pas, surtout dans le JV où tu fais des tonnes de calcul à chaque frame, à moins que tout ça ne soit optimisé au niveau du compilo.
    Vive les roues en pierre

  8. #8
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Ok, merci pour les infos, je comprends
    Par contre, je ne suis pas d'accord pour l'encapsulation, protected sert justement à cela. Je t'explique pas la pile d'appel si tu ne l'utilise pas.
    C'est le même soucis que l'encapsulation classique, mais au final ça rend bien des services
    Au final, même pour un jeu vidéo il y aura bien des choses à optimiser avant de se sentir ralentit par ça, et la sécurité du code à long terme c'est souvent le plus important.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

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

Discussions similaires

  1. Modifier et récuperer les données avec get et set
    Par rimbaut dans le forum Langage
    Réponses: 2
    Dernier message: 14/02/2010, 16h45
  2. Creer des methodes Get et Set avec c#
    Par loviso dans le forum C#
    Réponses: 4
    Dernier message: 04/08/2009, 11h19
  3. probleme avec les fonction get et set
    Par Invité dans le forum Flex
    Réponses: 0
    Dernier message: 23/01/2008, 14h44
  4. [PHP-JS] Comment tester un champ avant de valider avec GET ?
    Par anis_el_madani dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2007, 20h37
  5. [VB6]Property Get/Set avec groupe de contrôles
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 12h09

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