Domanda

E 'possibile fare qualcosa di simile?

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B: A
{
    private string X;
    public override string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

Cioè, la classe base fornisce una proprietà virtuale con solo una funzione di accesso GET, ma la classe bambino ignora il GET e fornisce anche una serie.

L'esempio attuale non si compila, ma forse mi manca qualcosa qui.

Aggiunto: Per chiarire, no io non voglio per ridefinire con il nuovo. Voglio aggiungere un nuovo accesso. So che non era nella classe base, quindi non può essere ignorato. OK, mi permetta di provare a spiegare come sarebbe senza lo zucchero sintattico:

class A
{
    public virtual string get_prop()
    {
            return "A";
    }
}
class B: A
{
    private string X;
    public override string get_prop()
    {
        return X;
    }
    public virtual string set_prop()
    {
        X = value;
    }
}
È stato utile?

Soluzione

No, questo non è possibile. Purtroppo non si può nemmeno ignorare e modificare il livello di accesso (da protetto per pubblici , per esempio), come documentato su MSDN . Vorrei raccomandare che si considera la ristrutturazione un po 'il codice / class e cercare un modo alternativo per eseguire questa operazione, come dichiara l'accesso set con il protetto modificatore utilizzando un metodo SetProperty nella classe derivata.

Altri suggerimenti

No, non v'è alcun modo per farlo. Pensate a come lo zucchero sintattico della vostra proprietà virtuale è in corso di esame, vale a dire che viene convertito in:

public virtual string get_prop();

Non esiste un metodo set_Prop per ignorare, e non si può ignorare un metodo che non esiste.

È possibile nascondere l'implementazione della classe base utilizzando la 'nuova' parola chiave nella classe derivata. Il seguente dovrebbe compilare con successo:

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B : A
{
    private string X;
    public new string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

L'introduzione di un nuovo campo sa di disordinato. E in entrambi i casi è necessario fare attenzione a non rompere il polimorfismo e l'ereditarietà (cosa succede se i colloqui di base di classe al campo privato?).

Per quanto riguarda l'aggiunta di una nuova funzione di accesso, mentre l'override; La semplice risposta è "no, non è possibile". Quando si ignora, si può avere un impatto solo le funzioni di accesso esistenti, dato che questo è ciò che viene definito nella virtual-tavolo per il membro (membro sovrascritto è ancora "posseduto" dalla base / dichiarando di classe, non la classe predominante).

Una possibilità (non ideale) è quello di ri-dichiarare la proprietà, ma si sarebbe ancora bisogno di un modo di parlare fino alla base della classe. Quindi, se la funzione di accesso nella base-classe era protected:

class A
{
    public string prop
    {
        get;
        protected set;
    }
}
class B : A
{
    public new string prop
    {
        get { return base.prop; }
        set { base.prop = value; }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top