5

The responsibility of the visibility of a method is relegated to the class that implements the interface.

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

In C# set access modifier public, private or protected before the method GetMyInfo() generates the following error: The modifier 'private' is not valid for this item.

Is there a reason you can not define the access modifier on a method or in an interface?

(Question already asked in french here)

4

5 に答える 5

14

The interface defines a contract between an object and clients that call its members. A private method cannot be accessed by any other objects so it doesn't make sense to add it to the interface. All members of an interface are considered public for this reason.

于 2009-10-30T20:34:23.380 に答える
10

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

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

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

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

このアプローチはGetMyInfo、 のパブリック インターフェイスの一部ではないことを意味しますMyClassMyClassインスタンスをIMyInterface次のようにキャストすることによってのみアクセスできます。

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");

そのため、インターフェイスのコンテキストでは、そのすべてのメンバーがパブリックになります。それらは実装クラスのパブリック インターフェイスから非表示にすることができますが、インスタンスへの型キャストを作成し、その方法でメンバーにアクセスする可能性は常にあります。

于 2009-10-30T20:53:50.843 に答える
4

オブジェクト指向に関して言えば、カプセル化はすべてデータの隠蔽に関するものです。つまり、クラス内で何が起こるかは、クラスの実装次第です。つまり、プライベート メンバーを契約で強制しても意味がありません。

ただし、インターフェイスを使用する理由は、クラスが特定のコントラクトに準拠し、複数のパブリック メンバーを一貫した方法で公開することを保証するためです。

于 2009-10-30T20:37:35.730 に答える
1

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

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

于 2009-10-30T21:07:15.653 に答える
0

インターフェイスのプライベート定義は次のようになります。

  1. インターフェイスのユーザーには何のメリットもありません (結局のところプライベートです)
  2. メソッドまたはプロパティを実装する必要があるように実装クラスを制約する
  3. インターフェースの概念的な性質を実装の詳細で曖昧にする
  4. プライベート メソッドを持つ抽象クラスのようにする (これは許可されていません)
于 2009-10-31T17:09:29.477 に答える