Question

Il existe une classe de base (boîte noire ;je ne peux pas le modifier) ​​dont je dérive.Dans ma classe dérivée, je ne souhaite plus autoriser les utilisateurs à utiliser une propriété, mais j'ai maintenant une fonction publique à utiliser à la place.Je n'entrerai pas dans les détails du pourquoi (ce n'est pas pertinent), mais voici la propriété que j'essaie de cacher :

public ComboBoxItemCollection Items { get; }

J'ai essayé ceci, mais cela n'a pas fonctionné :

private new ComboBoxItemCollection Items { get; set; }

J'ai aussi essayé ceci, mais le compilateur dit que je ne suis pas autorisé à rendre les deux accesseurs privés :

public new ComboBoxItemCollection Items { private get; private set; }

Comment puis-je y parvenir correctement ?Notez que je ne compte pas sur le fait qu'il s'agit d'une solution de sécurité complète, évidemment grâce au casting vers la classe de base, ils peuvent toujours appeler cette propriété.Ceci vise simplement à offrir à l'utilisateur une erreur de compilation, ce qui l'aide à comprendre qu'il ne peut pas utiliser cette propriété et qu'il doit plutôt utiliser la nouvelle fonction dans la classe dérivée.

MODIFIER

Grâce aux réponses de ce fil, j'ai trouvé la solution suivante :

    [Obsolete( "This property is obsolete. Please use MRUIdComboBox.AddItem() instead.", true )]
    public new ComboBoxItemCollection Items
    {
        get
        {
            throw new NotSupportedException( "This property is not supported. Please use MRUIdComboBox.AddItem() instead." );
        }
    }
Était-ce utile?

La solution

Vous ne pouvez pas.Le plus proche possible serait :

[Obsolete(IsError=true)]
public new ComboBoxItemCollection Items
{
    get { return base.Items; } // Or throw an exception
}

Personnellement, je serais tenté de demander si vous devriez vraiment en déduire si vous ne voulez pas que tous les membres...pouvez-vous utiliser la composition à la place ?

Autres conseils

Même si c'était possible, vous ne voulez pas vraiment "masquer" les accesseurs (comme vous l'avez noté, ils sont simplement accessibles via la classe de base).Vous recherchez un avertissement/une erreur indiquant « Cette méthode est obsolète et doit être évitée ».En tant que tel, vous voudrez peut-être examiner le Attribut obsolète, documenté comme "L'attribut Obsolete est utilisé pour marquer les types et les membres de types qui ne devraient plus être utilisés" - exactement votre cas d'utilisation.

Modifier:Je déconseille fortement de lancer une exception dans l'accesseur.Cela violerait ce que l'on appelle communément le "principe de substitution de Liskov" - selon lequel vous pouvez utiliser une classe dérivée partout où une classe de base est souhaitée.En réalité, ce n'est qu'un langage sophistiqué autour du fait que le code existant dans lequel vous pourriez transmettre une instance dérivée attend un .Items getter qui fonctionne de manière raisonnable, plutôt que d'exploser au contact.Si vous lancez une exception, vous pourriez avoir du mal à déboguer les erreurs dans des endroits très difficiles d'accès (étant donné que votre superclasse est une boîte noire).

Vous pouvez rendre la propriété publique dans la classe enfant et lever une exception en cas d'accès.Vous devez alors vous assurer que vous accédez uniquement à la propriété de classe de base au sein de la classe enfant.

public new ComboBoxItemCollection Items
{
    get { throw new InvalidOperationException(); }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top