2016-06-30 14 views

Odpowiedz

22

cóż, skoro A jest override niż klasy bazowej musi mieć zarównoget i set (inaczej kod się nie kompiluje) np

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

Teraz masz dwie różne klasy pochodne:

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 
    } 
} 

nazwijmy zarówno set metody:

// 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: Dziękujemy za podpowiedź! 'NotSupportedException' jest w rzeczywistości lepszym wyborem. –

6

Pierwszy zastąpi setter dla A w klasie bazowej przy użyciu metody, która nie robi nic. Więc możesz mieć A = "", ale to nic nie robi.

Metodą definiowania ustawiającego będzie public override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { }, aw drugim przypadku A = "" zostanie skompilowany, ale wywoła metodę ustawiającą klasy podstawowe dla A.

1

pierwsze: jest seter, ale w tym seter zrobi nic
Po drugie: nie ma seter

+0

Pewnie, że jest, ale łatwo go przeoczyć. W obu przypadkach jest seter. W pierwszym przypadku ustawiacz klasy podstawowej jest nadpisywany (aby nic nie robić), podczas gdy w drugim przypadku ustawiający klasy podstawowej jest dziedziczony (aby zrobić to, co jest zaimplementowane). – Zano

4

Ten getter i setter jest nadpisane. Ten kod zostałby skompilowany w obu przypadkach podczas wykonywania x.A ="". W pierwszym przypadku przesłonimy właściwość set, co oznacza, że ​​przy próbie przypisania wartości do obiektu nic się nie stanie. W drugim przypadku będzie korzystał klasy bazowej realizację

2

użyć override, więc zakładam, klasa Twój fragment pochodzi posiada klasy bazowej z czymś

public virtual string A { get; set; } 

Jeśli po prostu zastąpić getter (drugim przykładzie), oryginalny setter będzie nadal używany. Po prostu nie widzisz wyniku, ponieważ jest on ukryty przez Twoje przesłonięcie.

Jeśli przesłonisz także setter pustą metodą, program ustawiający bazę nie zostanie wywołany.

Powiązane problemy