2009-10-30 15 views
5

メソッドの可視性の責任は、インタフェースを実装するクラスに委ねられます。 「プライベート」修飾子をこのアイテムには有効ではありません:C#のでメソッドまたはインターフェイスでアクセス修飾子を定義できない理由はありますか?

public interface IMyInterface 
{ 
    bool GetMyInfo(string request); 
} 

)は、プライベートまたはメソッドGetMyInfo(前に保護されたアクセス修飾子の国民は、次のエラーを生成します設定します。

メソッドまたはインターフェイスでアクセス修飾子を定義できない理由はありますか?

(すでにフランス語hereに尋ねた質問には)

+0

[C#インターフェイスの非公開メンバー]の複製が可能です(http://stackoverflow.com/questions/17576/non-public-members-for-c-sharp-interfaces) – nawfal

答えて

14

インターフェイスオブジェクトとそのメンバーを呼び出すクライアントの間の契約を定義します。プライベートメソッドは他のオブジェクトからアクセスすることはできませんので、インターフェイスに追加するのは意味がありません。この理由から、インタフェースのすべてのメンバーは公開されているとみなされます。

+0

なぜあなたは 'protected'をスキップしましたか? – UnKnown

4

OOカプセル化の点では、すべてがデータの隠蔽です。つまり、クラス内で何が行われるのかは、クラスの実装までです。つまり、契約上民間メンバーを強制することは役に立たないでしょう。

しかし、インターフェイスを使用する理由は、クラスが特定の契約を順守し、一貫した方法で複数のパブリックメンバーを公開したいからです。

+0

現実には、モニタにコードをコンピュータに接続するための物理的なインターフェイスが、ピンが不足している(隠されていた/隠されていたために)任意に欠けていましたか?それだけではうまくいかないでしょう。だからこそ、仮想インタフェースでさえ完全に存在し、公開されなければならないのです。その余分なビットについては –

10

明示的なインターフェイスの実装を行う場合実際には、実装クラスにメソッドをプライベートにすることができます。

public interface IMyInterface 
{ 
    bool GetMyInfo(string request); 
} 

public class MyClass : IMyInterface 
{ 
    public void SomePublicMethod() { } 

    bool IMyInterface.GetMyInfo(string request) 
    { 
     // implementation goes here 
    } 
} 

このアプローチはGetMyInfoMyClassのパブリックインターフェイスの一部ではないことを意味します。それだけでIMyInterfaceMyClassインスタンスをキャストすることによってアクセスすることができます。

MyClass instance = new MyClass(); 

// this does not compile 
bool result = instance.GetMyInfo("some request"); 

// this works well on the other hand 
bool result = ((IMyInterface)instance).GetMyInfo("some request"); 

ので、インターフェースのコンテキストで、そのすべてのメンバーは、公開されます。それらは実装クラスのパブリックインターフェイスから隠すことができますが、常にインスタンスへの型キャストを行い、そのようにメンバにアクセスする可能性があります。

+1

+1です。しかし、私はなぜ、またはどのような状況で、この動作が望ましいか分かりませんでした(???) – Yoopergeek

+0

はい、ありがとうございました –

+0

この珍しい抜け穴を指摘してくれてありがとう。 – warriorpostman

1

インターフェイスのすべてのメソッドは、同じアクセスレベルを持つ必要があります。つまり、呼び出し元がすべてのメソッドを使用できるようにする必要があります。ただし、インタフェースは内部(またはネストされたインタフェースプライベート)でもかまいません。

異なるアクセスレベルが必要な場合は、別個のインターフェイスを使用してください。

0

インタフェースの民間定義はなります

  1. は、メソッドやプロパティを実装する必要が実装するクラスを制約
  2. (それはすべての後にプライベートで)インタフェースのユーザに何のメリットを提供しない
  3. (許可されていない)プライベートメソッドと抽象クラスのように実装上の詳細とのインタフェースの概念性質
+0

"private"修飾子は有用ではないかもしれませんが、 "internal"アクセス修飾子は有用です。外部コードが抽象クラスへの参照を渡すことを許可したいが、そのすべての機能を使用したり、代わりに代入可能なオブジェクトを作成したりしたくない状況がある。どのタイプのオブジェクトが互いに代入可能であるべきかのグラフは、ツリーではなく、単に継承ではなくインターフェースでモデル化できる状況があります。 2つの状況が重なるときは、内部インタフェースメソッドが便利です。 – supercat

関連する問題