2016-06-30 1 views
1
[KnownType(typeof(B))] 
public abstract class A: IA // string Description { get; } 
{ 
     [DataMember(Name = "description")] 
     public virtual string Description { get; set; } 
} 

public sealed class B: A 
{ 
    public override string Description 
    { 
     get 
     { 
      return "Custom_Description"; 
     } 
    } 
} 

私は私の抽象クラスを変更することはできませんし、私のようなDescriptionsetを使用禁止にしたい:プロパティセッターの使用を禁止する方法は?

B b = new B(); 
b.Description = "description"; 

はどのようにそれを行うには? setはどのように実装できますか?

+0

奇妙な...これは[Lに違反していること –

+2

注意SOLID](https://en.wikipedia.org/wiki/Liskov_substitution_principle)を参照してください。適切な方法は、抽象基盤を変更することです。 – GazTheDestroyer

+0

@ GazTheDestroyerありがとう、抽象ベースを変更するには? –

答えて

2

私はあなたの最良のオプションはセットアクセサで非サポート例外をスローすることだと思う:

public sealed class B : A { 
    public override string Description { 
     get { 
      return "Custom_Description"; 
     } 
     set { 
      throw new NotSupportedException(); 
     } 
    } 
} 

あなたがコンパイルエラーを取得したい場合は、 のアクセシビリティを変更することはできませんとして、代わりに、それが、ことはできませんBsetメソッド。可能であれば、BのインスタンスをタイプAにキャストし、そのセットを呼び出すことができます。

0

あなたが抽象クラスであれば、それはできないと思います。周りの醜い作品は以下のようになり :ここではセッターで

public sealed class B: A 
{ 
    public override string Description 
    { 
     get 
     { 
      return "Custom_Description"; 
     } 
     set 
     { 
      throw new InvalidOperationException(); 
     } 
    } 
} 

あなたはまた、破棄することができます(それを使用それを取るではなく)値

1

は2つの方法があります。

  1. 単にセッターを保護します。

    public abstract class A: IA 
    { 
        public virtual string Description { get; protected set; } 
    } 
    

    これは、コードの90%が説明を設定できないことを保証します。しかし、クラスAの継承者では、まだを設定しようとすることができますを設定します。コンパイル時の安全性

  2. 元の自動プロパティをセッターなしの抽象プロパティに置き換えます。 次に、クラスBでそれを実装します。また、別のクラスでは、プロパティを設定/取得する機能が必要な場合は、バッキングフィールドを作成できます。これはより安全な方法ですが、コピーペーストコードを減らすことができます。あなたはそれに `B.を書くとき、彼らは[KnownType(typeof演算(B))]`を追加として明らかに誰かが、可能性あなたの抽象クラスAを変更することはできません

関連する問題