Jaka jest różnica między tymi dwiema implementacjami właściwości?Seter pustych kontra no seter w właściwościach
public override string A
{
get { return "s"; }
set { }
}
public override string A
{
get { return "s"; }
}
Jaka jest różnica między tymi dwiema implementacjami właściwości?Seter pustych kontra no seter w właściwościach
public override string A
{
get { return "s"; }
set { }
}
public override string A
{
get { return "s"; }
}
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";
@CodesInChaos: Dziękujemy za podpowiedź! 'NotSupportedException' jest w rzeczywistości lepszym wyborem. –
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
.
pierwsze: jest seter, ale w tym seter zrobi nic
Po drugie: nie ma seter
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
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ę
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.
Wypróbuj 'A =" ";' i zobacz, co się stanie. –