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 :

Restreindre l'accès à une classe


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de seb.49
    Profil pro
    ljgdfgdf
    Inscrit en
    Octobre 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ljgdfgdf

    Informations forums :
    Inscription : Octobre 2002
    Messages : 291
    Par défaut Restreindre l'accès à une classe
    Bonjour,

    J'aimerai restreindre l'accès à une classe.

    [EDIT un exemple sera plus clair]
    UneClasseMere.oMonObjet.Test(); --> doit marcher

    MonObjet oMonObjet = new MonObjet(); --> ne doit pas etre possible
    oMonObjet.Test(); --> ne doit pas etre possible
    [/EDIT]
    J'ai un projet web qui référence une dll d'une bibliothèque de classe

    Dans ma bibliothèque de classe j'ai :
    - Class_1
    -----Class_2

    Je veux que classe 1 puisse utiliser classe 2 et en faire une propriété publiques. Par contre, je ne veux pas que mon projet web accès directement à Class_2, il faut que l'on fasse Class_1.InstanceDeClass_2

    j'essaie avec internal mais quand je créé la propriété publique sur Class_2, j'ai l'erreur :
    Accessibilité incohérente : le type de propriété 'MaBiblioDll.MonObjet' est moins accessible que la propriété 'MaBiblioDll.Class_1.InstanceDeMonObjet'.
    J'espère que mon explication est assez claire, merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Impossible car le compilateur doit connaitre le type de classe2 pour pouvoir compiler le code qui utiliserait la propriété de type classe2 contenue dans classe1.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Si tu veux vraiment cacher ta Classe2, il va falloir la définir en internal et ensuite "encapsuler" en public toutes les fonctions que tu veux lui appliquer depuis Classe1.
    C'est-à-dire redéfinir, dans Classe1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Classe1
    {
       public int TestMonObjet()
       {
          return this.oMonObjet.Test();
       }
       private Classe2 oMonObjet;
    }
    Du moins je ne vois pas d'autre solution.
    Depuis l'extérieur de ta dll : soit tu connais la classe, soit tu ne la connais pas... et si tu veux appliquer des fonctions sur une propriété de type Classe2, c'est que tu supposes que la connais...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Déclarer ta classe public mais son constructeur internal ça ne fonctionne pas ?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Citation Envoyé par Sphax
    Déclarer ta classe public mais son constructeur internal ça ne fonctionne pas ?
    Je confirme, c'est bien légal de déclarer un constructeur d'une classe public internal, et ça donne le résultat que tu veux.


    Tu peux aussi passer par une interface public, ta Classe2 implémentant cette interface et ta classe1 renvoyant aussi cette interface. Classe2 déclarée internal. Mais ça ne correspond pas trop au code que tu donnes .

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par Sphax
    Déclarer ta classe public mais son constructeur internal ça ne fonctionne pas ?
    Ça permet d'interdire à l'utilisateur d'instancier un objet de type Classe2. Mais on peut toutefois obtenir un de ces objets (grâce à la propriété oMonObjet par exemple...) et ensuite lui appliquer directement toutes les fonctions qu'on veut.
    Cependant, il est vrai que je n'ai pas tout à fait compris pourquoi seb.49 voulait limiter de cette façon l'accès à sa classe, donc ça lui conviendra peut-être




    @seb.49 : je ne comprends pas ce que tu essaies de faire avec cette interface...
    Mes commentaires sur ton 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
    17
    18
    19
    public interface MonObjet
    {
       void Test();        
    }
    public class MaClasseMere : MonObjet
    {
       public MonObjet aa; // MaClasseMere hérite de MonObjet ET contient un MonObjet ??
       void MonObjet.Test()
       {
          throw new Exception("The method or operation is not implemented.");
       }
    }
    /*************************************/
    public class MaClasseUtilisatrice
    {
       wwSuiviApplication.aa.Test(); // ça balance l'exception
       MonObjet aa = new MonObjet(); // MonObjet est une interface : pas possible de l'instancier !
       aa.Test(); // en supposant que aa soit de type MonObjet, je ne sais pas ce que ça fait, ça dépend de la classe sous-jacente
    }
    Et si tu nous disais pourquoi tu veux "limiter l'accès à ta classe" ? Il arrive qu'on parte sur une idée qui s'avère être une fausse piste, en reprenant du début on repartira peut-être sur la bonne voie.

    Lors de l'appel de "UneClasseMere.oMonObjet.Test()", il faut voir les choses comme ceci :
    - d'abord tu récupères un objet de classe Classe2
    - puis tu appelles sur cet objet la fonction Test()
    Donc c'est bien uniquement si la fonction Test() est accessible depuis l'extérieur de ta dll que tu peux effectuer ce type d'appel...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Ma solution effectivement n'a pour but que d'interdire à l'extérieur de construire un objet de type Classe2. C'est ce que j'ai compris de la question d'origine.

    Seb.49 a écrit:
    UneClasseMere.oMonObjet.Test(); --> doit marcher

    MonObjet oMonObjet = new MonObjet(); --> ne doit pas etre possible
    oMonObjet.Test(); --> ne doit pas etre possible
    Ce qui semble bien vouloir interdire uniquement la création de MonObjet depuis l'extérieur de la bibliothèque.

  8. #8
    Membre éclairé Avatar de seb.49
    Profil pro
    ljgdfgdf
    Inscrit en
    Octobre 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ljgdfgdf

    Informations forums :
    Inscription : Octobre 2002
    Messages : 291
    Par défaut Utiliser une interface ?
    Le seul moyen est-il l'interface :
    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
     
     public interface MonObjet
        {
            void Test();        
        }
    /*************************************/
     public class MaClasseMere : MonObjet
    {
    public MonObjet aa;
    void MonObjet.Test()
            {
                throw new Exception("The method or operation is not implemented.");
            }
    }
    /*************************************/
    public class MaClasseUtilisatrice
    {
    wwSuiviApplication.aa.Test(); ----> Ok
     
            MonObjet aa = new MonObjet(); --> Pas ok mais on peut implémenter
            aa.Test();                               --> l'interface quand même :-(
    }

Discussions similaires

  1. [VBA] [CLASS] accès à une classe d'une autre base
    Par gsilber dans le forum Contribuez
    Réponses: 5
    Dernier message: 29/02/2016, 12h38
  2. [VxiR2] Restreindre l'accès à une classe
    Par nin33 dans le forum Designer
    Réponses: 3
    Dernier message: 21/03/2011, 15h59
  3. Réponses: 7
    Dernier message: 26/03/2008, 17h20
  4. Restreindre l'accès à une URL précise
    Par gavelin dans le forum Apache
    Réponses: 3
    Dernier message: 17/05/2006, 13h09
  5. [Visual C++6] Accès à une classe d'une dll
    Par charliejo dans le forum MFC
    Réponses: 12
    Dernier message: 09/03/2005, 16h48

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