2016-06-30 85 views

risposta

22

Ebbene, dal momento che A è override rispetto alla classe di base deve avere siaget e set (altrimenti il codice non viene compilato) ad es

public class MyBase { 
    public virtual String A { 
    get { 
     return "getBaseA"; 
    } 
    set { 
     throw new NotSupportedException("setBaseA"); 
    } 
    } 
} 

Ora si hanno due diversi classi derivate:

public class MyDerivedA: MyBase { 
    public override String A { 
    get { 
     return "s"; 
    } 
    set { // set is overridden, now set does nothing 
    } 
    } 
} 

public class MyDerivedB: MyBase { 
    public override String A { 
    get { 
     return "s"; 
    } 
    // set is not overridden, same as in the base class 
    } 
} 

Chiamiamo entrambi i metodi: set

// Does nothing: overridden MyDerivedA.A.set is called 
MyBase test1 = new MyDerivedA(); 
test1.A = "Sample"; 

// Will throw NotSupportedException (base MyBase.A.set is called) 
MyBase test2 = new MyDerivedB(); 
test2.A = "Sample"; 
+1

@CodesInChaos: Grazie per il suggerimento! 'NotSupportedException' è in realtà una scelta migliore. –

6

Il primo avrà la precedenza il setter per A in classe di base con un metodo che sta facendo nulla. Quindi puoi avere A = "" ma non sta facendo nulla.

Il metodo quando si definisce un setter sarà public override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { } e nel secondo caso A = "" verrà compilato ma verrà chiamato il setter della classe di base per A.

1

Primo: c'è un setter, ma in quel setter farà nulla
Secondo: non c'è setter

+0

Certo che c'è, ma è facile non vederlo. C'è un setter in entrambi i casi. Nel primo caso il setter della classe base viene sovrascritto (per non fare nulla), mentre nel secondo caso viene ereditato il setter della classe base (per fare qualsiasi cosa venga implementata). – Zano

4

Questo getter e setter è sovrascritto. Questo codice verrà compilato in entrambi i casi quando si esegue x.A ="". Nel primo caso sostituiamo la proprietà set, il che significa che quando si tenta di assegnare un valore all'oggetto non accadrà nulla. Nel secondo caso si utilizzerà implementazione della classe base

2

Si utilizza override, quindi immagino che la classe vostro frammento è da ha un baseclass con qualcosa come

public virtual string A { get; set; } 

Se hai appena ignorare il getter (il secondo esempio), il setter originale verrà comunque utilizzato. Semplicemente non vedi il risultato perché è nascosto dal tuo override.

Quando si esegue l'override del setter con un metodo vuoto, il setter di base non verrà chiamato.