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++/CLI Discussion :

[C++/CLI] Briser l'encapsulation ?


Sujet :

C++/CLI

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    �tudiant
    Inscrit en
    Avril 2006
    Messages
    26
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par d�faut [C++/CLI] Briser l'encapsulation ?
    Bonjour,
    Il n'y a pas de forum sp�cifique pour le C++/CLI, donc je me permet de poster ici.

    Bon alors... Regardez le r�sultat de l'�x�cution de ce code :

    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
     
    /* L'interface de la classe de test */
    public interface class ITest{<div style="margin-left:40px">System::Int32^ getVal();</div>};
     
    /* la classe de test */
    public ref class Test : ITest{<div style="margin-left:40px">private:<div style="margin-left:40px">System::Int32^ val;
    Test(System::Int32^ i)
    :val(i)
    {}</div>public:<div style="margin-left:40px">static ITest^ create(System::Int32^i){<div style="margin-left:40px">return gcnew Test(i);</div>}
    virtual System::Int32^ getVal(){<div style="margin-left:40px">return this->val;</div>}</div></div>};
     
    /* La fonction principale */
    void main(void){<div style="margin-left:40px">ITest^ test = Test::create(1);
    int %j = *(test->getVal());
    j = 2;
    System::Console::WriteLine("val = " + test->getVal());</div>}
    R�sultat :
    val = 2
    Ca craint un peu non ? en deux lignes on brise l'encapsulation de la classe Test...

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par d�faut
    salut,

    � vrai dire je vois pas ton probl�me l�...
    ce que tu as �crit est VALABLE �galement en C++ non manag�.
    Tu affecte une valeur toi meme � j apr�s avoir r�cup�r� la valeur fourni par l'instance... il est logique que tu r�cup�re la nouvelle valeur affect�, qui �crase la pr�c�dente....

    je ne vois vraiment pas en quoi ce comportement te choque ou d�range, il est logique dans tout langage imp�ratif et s�quentiel.

  3. #3
    Membre averti
    Profil pro
    �tudiant
    Inscrit en
    Avril 2006
    Messages
    26
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par d�faut
    Je sais que c'est valable, mais Test::val �tant d�clar� priv�e, on ne devrait pas pouvoir la manipuler en dehors de Test.

    Le fait de pouvoir briser l'encapsulation me g�ne pour la simple raison suivante :
    Imaginons que tu travailles sur un projet de grande ampleur et que la conception des diff�rents modules est r�partie entre plusieurs �quipes. Tu d�veloppes ton composant et le passe � une autre �quipe.

    Admettons maintenant que certains setters d�crits dans ton interface r�alisent un traitement particulier sur la donn�e avant de r�aliser l'affectation. Par exemple, le setter d'une valeur "val" va r�aliser le traitement suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    public void setVal(int x){
            val = x + offset;
    }
    Alors l'�quipe qui va manipuler ton composant peut tr�s bien utiliser la technique d�crite dans mon premier post pour manipuler directement "val" (sans pour autant le faire expr�s) et pourrir toute la m�canique de ton code.

    Enfin voila... j'ai �t� surpris

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Dans ce cas, il suffit de retourner directement l'entier val, plust�t que de le retourner box�...

    Mais si �a peut te rassurer, cela n'est pas possible en C# (et sans doute aussi en VB) : Le langage consid�re les types valeur box�s comme immuables.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    �tudiant
    Inscrit en
    Avril 2006
    Messages
    26
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par d�faut
    C'est plut�t vrai ! Merci beaucoup

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [C++/CLI] Briser l'encapsulation ?
    Par Kyrel dans le forum G�n�ral Dotnet
    R�ponses: 1
    Dernier message: 08/10/2007, 09h51
  2. R�ponses: 31
    Dernier message: 30/03/2006, 16h57
  3. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    R�ponses: 8
    Dernier message: 08/06/2005, 15h57
  4. Encapsulation graphique d'un outil en ligne de commande
    Par Leishmaniose dans le forum Composants VCL
    R�ponses: 3
    Dernier message: 12/11/2003, 11h59
  5. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    R�ponses: 2
    Dernier message: 13/06/2002, 14h58

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