Domanda

Esiste una classe base (scatola nera;non posso modificarlo) da cui derivo.Nella mia classe derivata, non voglio più consentire agli utenti di utilizzare una proprietà, ma ora ho una funzione pubblica da utilizzare.Non entrerò nei dettagli del perché (è irrilevante), ma ecco la proprietà che sto cercando di nascondere:

public ComboBoxItemCollection Items { get; }

Ho provato questo, ma non ha funzionato:

private new ComboBoxItemCollection Items { get; set; }

Ho provato anche questo, tuttavia il compilatore dice che non sono autorizzato a rendere privati ​​entrambi gli accessor:

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

Come posso realizzarlo correttamente?Tieni presente che non dipendo dal fatto che questa sia una soluzione di sicurezza completa, ovviamente attraverso il cast della classe base possono ancora chiamare questa proprietà.Questo ha semplicemente lo scopo di offrire all'utente un errore in fase di compilazione, che lo aiuta a capire che non può utilizzare questa proprietà e dovrebbe invece utilizzare la nuova funzione nella classe derivata.

MODIFICARE

Grazie alle risposte in questo thread, ho trovato la seguente soluzione:

    [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." );
        }
    }
È stato utile?

Soluzione

Non puoi.Il massimo a cui potresti arrivare sarebbe:

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

Personalmente sarei tentato di chiederti se dovresti davvero derivare da questo se non vuoi tutti i membri però...puoi usare la composizione invece?

Altri suggerimenti

Anche se fosse possibile, non vuoi davvero "nascondere" le funzioni di accesso (come hai notato, è possibile accedervi semplicemente tramite la classe base).Stai cercando un avviso/errore che dice "Questo metodo è deprecato e dovrebbe essere evitato".In quanto tale, potresti voler dare un'occhiata a Attributo obsoleto, documentato come "L'attributo Obsolete viene utilizzato per contrassegnare tipi e membri di tipi che non dovrebbero più essere utilizzati" - esattamente il tuo caso d'uso.

Modificare:Sconsiglio vivamente di generare un'eccezione nell'accessor.Ciò violerebbe quello che viene comunemente chiamato il "principio di sostituzione di Liskov": è possibile utilizzare una classe derivata ovunque si desideri una classe base.In realtà, è solo un linguaggio fantasioso sul fatto che il codice esistente a cui potresti passare un'istanza derivata si aspetta un file .Items getter che funziona in modo sensato, anziché esplodere al contatto.Se lanci un'eccezione, potresti avere difficoltà a eseguire il debug degli errori in posti molto difficili da raggiungere (dato che la tua superclasse è una scatola nera).

Potresti rendere pubblica la proprietà nella classe figlia e lanciare un'eccezione se vi si accede.Devi assicurarti quindi di accedere solo alla proprietà della classe base all'interno della classe figlia.

public new ComboBoxItemCollection Items
{
    get { throw new InvalidOperationException(); }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top