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

Windows Forms Discussion :

[C#] Comment masquer un membre hérité


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juillet 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 12
    Par défaut [C#] Comment masquer un membre hérité
    Bonjour,

    j'ai un controle maListBox qui dérive du controle ListBox.
    Je voudrais masquer la propriété "DataSource" qui est publique pour forcer l'utilisateur à utiliser mes méthodes pour l'initialiser.

    J'utilise l'opérateur "new" mais ca ne fonctionne pas, la propriété 'DataSource' de ma classe de base est toujours visible depuis l'exterieur...

    Comment fait il faire ?

    Merci

    Stéphane

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut Re: [C#] Comment masquer un membre hérité
    Citation Envoyé par sblanc74
    Comment faut il faire ?
    Faut pas.

    Un héritage est un contrat. La classe dérivée doit supporter la même interface que la classe de base. Elle ne peut qu'ajouter des fonctionnalités (et/ou changer le comportement via les méthodes virtuelles).

    Si tu ne veux pas de propriété DataSource, il ne faut pas hériter d'une classe qui en contient une. Tu peux faire un contrôle 'de base' (héritant de Control ou UserControl), qui contient un contrôle ListBox privé et qui lui retransmet uniquement les propriétés et méthodes que tu veux. C'est plus lourd à faire, mais c'est ça ou rien.

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 12
    Par défaut
    D'accord, mais alors à quoi sert la fonctionnalisté "Hiding through inheritance" décrite dans la spécification du langage C# ?

    http://msdn.microsoft.com/library/de...spec_3_7_1.asp[/url]

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par sblanc74
    D'accord, mais alors à quoi sert la fonctionnalisté "Hiding through inheritance" décrite dans la spécification du langage C# ?

    http://msdn.microsoft.com/library/de...spec_3_7_1.asp[/url]
    Ça c'est l'opérateur new. Si tu définis dans ta classe dérivée des méthodes ayant le même nom et les mêmes paramètres qu'une méthode de la classe de base.

    Mais ça ne permet pas d'empêcher l'appel à une méthode. Juste d'en mettre une autre à la place. Et l'appel doit passer explicitement par une variable déclarée du type de la classe dérivée. C'est pas de polymorphisme.
    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
    public class A
    {
      public void Toto( string titi ) { ... }
    }
     
    public class B : A
    {
      public new void Toto( string titi ) { ... }
    }
     
    ...
     
    B bleh = new B();
    bleh.Toto( "blih" ); -> appel de la version B
     
    A blah = new B();
    blah.Toto( "blih" ); -> appel de la version A

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 12
    Par défaut
    si je comprends bien, le "new" permet de surcharger une méthode qui n'a pas été déclarée comme virtual ou abstract alors ? (ce qui est crad....)

    "new" équivaut à un "override"

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par sblanc74
    si je comprends bien, le "new" permet de surcharger une méthode qui n'a pas été déclarée comme virtual ou abstract alors ? (ce qui est crad....)

    "new" équivaut à un "override"
    Nope. Ça permet de déclarer une méthode de même nom+paramètres qui 'masque' une méthode dans la classe de base. Mais ça n'a rien à voir avec l'override. La grosse différence étant le polymorphisme.

    Prends le bout de code plus haut et compare à ça :
    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
    public class A
    {
      public virtual void Toto( string titi ) { ... }
    }
     
    public class B : A
    {
      public override void Toto( string titi ) { base.Toto( titi ); ... }
    }
     
    ...
     
    B bleh = new B();
    bleh.Toto( "blih" ); -> appel de la version B
     
    A blah = new B();
    blah.Toto( "blih" ); -> appel de la version B
    Tu vois la différence ? :)

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 12
    Par défaut
    ok j'ai compris... merci

    je peux contourner mon problème de la manière suivante :

    new public object DataSource
    {
    get { return base.DataSource;
    }


    Comme ca quand on appelle 'DataSource' en dehors de mon composant, la propriété passe en lecture seule... (sous reserve que l'on soit du type "maListBox" bien sur...

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par sblanc74
    Comme ca quand on appelle 'DataSource' en dehors de mon composant, la propriété passe en lecture seule... (sous reserve que l'on soit du type "maListBox" bien sur...
    Voilà. Mais ça reste du domaine de la bidouille et pas fool-proof, faut garder ça en tête :)

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 12
    Par défaut
    ouep mais c'est mieux que rien

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

Discussions similaires

  1. comment masquer le bureau
    Par devalender dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/07/2005, 14h36
  2. Réponses: 1
    Dernier message: 05/11/2004, 17h15
  3. Comment masquer le MessageBox de la barre des tâches ?
    Par Coussati dans le forum Langage
    Réponses: 7
    Dernier message: 25/08/2003, 14h33
  4. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54

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