2011-09-24 17 views
7

私はインターフェイスを継承し、自動的に生成された一部のプロパティをprivateとして作成しようとしました。これは一例です。C#でアクセシビリティ修飾子を使用してプロパティを継承

public class MyClass 
{ 
    public interface A 
    { 
     int X {get; set;} 
    } 
    public interface B : A 
    { 
     int Y {get; set;} 
    } 

    public class C : A 
    { 
     public int X {get; private set;} 
    } 

コンパイルしようとしたとき。 'MyClass.C' does not implement interface member 'MyClass.A.X.set'. 'MyClass.C.X.set' is not public.というエラーが発生しました。

private set;iterface Aに入れましたが、もう一度このエラーが発生しました:'MyClass.A.X.set': accessibility modifiers may not be used on accessors in an interface

このアクセシビリティ修飾語はC#では使用できませんか?

答えて

21

私はプライベートセットで試しました。 iterfaceのAに、しかし、あなたのインタフェースは唯一のプロパティは、検索可能であることを必要とする場合、私は再び

このエラーを得た、あなたのようにそれを定義します。

public interface A 
{ 
    int X {get;} // Leave off set entirely 
} 
1

インターフェイスの宣言は、実装する型に必要なパブリック・セットを定義します。したがって、CAを実装する場合は、インターフェイスによって定義された各メンバーのパブリックメンバーが必要です。

Aは、すべての実装タイプがパブリックプロパティーXとパブリックゲッターとパブリックセッターを持っていなければならないと定義しています。 Cはこの要件を満たしていません。

+0

パブリックメンバーだけではありません。明示的なインタフェース実装はもう1つです。暗黙的インターフェイスメンバを実装する – svick

0

あなたは最低限の機能としてインターフェイスを考えることができますあなたのクラスが実装しなければならないこと。インターフェースは、プロパティがgetset句を公開することを指定した場合のみ、パブリックメソッドとプロパティが暗黙的インターフェイスを実装することができますので、あなたは、あなたのクラスのパブリックgetset句を実装する必要があります。

あなたが公共のミューテーターを公開したくない場合は、単にインターフェイスプロパティ定義にsetキーワードを除外することができます。次に、実装ミューテータをpublicまたはprivateにすることができます。

0

いいえ、許可されていません。これは、クラスの継承だけでなく、インターフェイスに適用されます

に契約は、プロパティX用のパブリックgetterとsetterであることを意味し、class Cのインスタンスを使用しているコードがinterface Aとして扱うことができなければならないことを覚えておいてください継承 - あなたはあなたが由来するタイプの契約に従わなければなりません。

コードの意図は、プロパティXは公共セッターを持つべきではないということであれば、インターフェースが、私はインターフェイス自体が公開されている場合は、インターフェイスのメンバーはパブリックでなければならないと考えているだけで{ get; }

0

で定義されるべきです。そのため、あなたのプロパティの実装には問題があります。

+1

メンバーは*関わらず*インタフェース自体のアクセシビリティドメインの公開でなければなりません。 –

関連する問題