2016-06-24 2 views
2

いくつかのクラスによって継承される1つのインターフェイスがありますが、一部のプロパティはクラスのコンストラクタによってのみ設定されます。私はコンストラクタの外にあるプロパティの値を変更することはありませんので、プロパティをプライベートなセッタで制限したいのですが、インターフェイスではどのタイプの修飾子でもプロパティを使用できません?あなたのインターフェイスでC#インターフェイスのプロパティを制限する方法

+3

おそらくインターフェイスからセッターを削除しますか? –

+0

あなたの意図を文書化する以外に、インタフェースを実装する人があなたのガイドラインに従うことを望むことはできません。 –

+0

あなたが持っているものとあなたが望むものをより良く見せるためには、[mcve]を打ちます。 – Nkosi

答えて

1

インターフェイスには、実装するすべてのタイプで実行可能でなければならないことが記述されています。定義できないのはできません。

インターフェイスは、適切な名前とタイプの指定されたプロパティゲッターが存在しなければならないことを定義することができ、それはそのプロパティのパブリックセッターがないなければならないことを指定することはできません。あなたは確かだ

は、このインタフェースが実装者が民間のセッターを持っていること、または、彼らは決してコンストラクタの外で変更する値を許可していないにもいることを示唆して文書を提供するために歓迎するが、そのような制約を指定するためのインタフェースのための方法はありません。

-1

指定するのみゲッター:コンパイラおよび言語上のこれらのプロパティの不変性を強制する方法はありません

class Foo : ISomeInterface 
{ 
    public int SomeProperty { get; private set; } 

    public Foo() 
    { 
     SomeProperty = 42; 
    } 
} 
+0

これは、プロパティゲッターをプライベートにすることを強制しません。プライベートであることを許可します。 – Servy

+0

@Servyは、プロパティのゲッターをプライベートにすることができれば、何が変わるかを明確にすることができますか? – PreqlSusSpermaOhranitel

+1

@PreqlSusSpermaOhranitelこれは、値をコンストラクタの外で変更できるようにするインターフェイスの実装を作成できなかったことを意味します。 – Servy

0

interface ISomeInterface 
{ 
    int SomeProperty { get; } 
} 

あなたの実装が非公開に設定するのは自由ですレベル。

つまり、これらのプロパティの不変性が許可されている唯一のものではなく、クラスのパブリックセッターを持たないようにインターフェイスを書く方法はありません。

この言語には、この要件を表現するための構文はありません。

あなたセッターせずに、あなたのインターフェイスでプロパティを宣言することができますが、

  • その価値をしてください変更することはありません

    1. は何のセッターを持っていない

      に実装の実際のプロパティを必要とすることはできませんインターフェイスを介して実装クラスのみを公開すると、インターフェイスで宣言したアクセスメソッドのみが使用可能になることに注意してください。言い換えれば、インターフェースがゲッターを宣言するだけであれば、インターフェースを通して値を設定することはできません。

      あなたの最良の選択肢は、インタフェース契約のこの部分を単に文書化することです。このインタフェースを実装する人は、あなたの意図とガイドラインに従ってください。

    関連する問題