2016-06-30 13 views

答えて

22

まあはありません、Aがそうでなければを持っている必要があります、基本クラスよりもoverride両方getset(ですので、まず

+1

@CodesInChaos:ヒントありがとう! 'NotSupportedException'は実際にはより良い選択です。 –

6

最初のものは、何もしない方法で基本クラスのAの設定を上書きします。あなたはA = ""を持つことができますが、何もしていません。

セッターを定義するメソッドはpublic override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { }になり、2番目のケースではA = ""がコンパイルされますが、Aの基本クラスのセッターが呼び出されます。そこセッターがあるが、そのセッターに
第二に何もしません:なしセッター

1

コードはコンパイルされません)

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

今、あなたは二つの異なる派生クラスがあります。

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

をの両方の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"; 
+0

確かにありますが、見逃しやすいです。両方のケースにセッターがあります。最初のケースでは、基本クラスのセッターがオーバーライドされます(何もしません)。後者の場合は、基本クラスのセッターが継承されます(実行するために実装されたものを実行するため)。 – Zano

4

このゲッターとセッターがオーバーライドです。 x.A =""を実行している場合、このコードはどちらの場合でもコンパイルされます。 最初のケースでは、setプロパティをオーバーライドします。つまり、オブジェクトに値を代入しようとすると何も起きません。後者の場合には、基本クラスの実装あなたがoverride使用

2

を使用しますので、私はあなたのフラグメントが

public virtual string A { get; set; } 

あなただけのgetterをオーバーライドする場合(2番目の例のようなもので基底クラスを持っているからであるクラスと仮定します)、元のセッターは引き続き使用されます。オーバーライドによって隠されているので、結果は表示されません。

また、空のメソッドでセッターをオーバーライドすると、基本セッターは呼び出されません。

関連する問題