web-dev-qa-db-ja.com

インターフェイスメソッドをパブリックとして宣言する必要があるのはなぜですか?

interfaceメソッドを実装すると、publicメソッドにする必要があります。

default(同じパッケージ内でアクセスする場合など)またはprotectedを使用したい場合があります。

誰でもこの制限の背後にある理由を説明できますか?

32
Vishnu

インターフェイスは、型のpublic APIを定義するためのものであり、それだけであり、その実装ではありません。したがって、インターフェースで定義するメソッド(または静的メンバー)は、publicの定義によるものです。

インターフェースには具体的な実装を含めることができないため、内部からメンバーメソッドを呼び出す方法はありません。そして、そのようなメソッドを宣言するが、それらへの呼び出しをサブクラスまたは完全に無関係なクライアントに任せることは、型定義が不完全で壊れやすいことを意味します。そのため、保護されたメンバーまたはパッケージアクセスメンバーを定義する必要がある場合は、抽象クラス(実装も含まれている場合があります)で定義できます。

54
Péter Török

多分 this はいくつかの答えを提供します。

私の知る限り、あなたはinterfacesを使用して、コードの外部からの人々がコードと相互作用できるようにします。これを行うには、メソッドpublicを定義する必要があります。

特定のプライベートメソッドのセットをオーバーライドするように強制したい場合は、一連の抽象保護メソッドを含む抽象クラスを宣言することができます。

10
npinti

インターフェースは、それを実装するクラスがインターフェースにメソッドを持つことになるコントラクトです。インターフェイスは、このクラスにメソッドがあり、それらが呼び出されることをプログラムの残りの部分に示すために使用されます

1
nist

編集:この回答は、C#インターフェイスの実装を対象としています。このJava=の場合、シナリオは、構文アナライザーがインターフェースで言及されているパブリックキーワードを必要とするだけで、C#で暗黙的に行われます。

インターフェイスメソッドはC#では暗黙的にパブリックです。これは、インターフェイスが他のクラスで使用されることを意図したコントラクトであるためです。さらに、インターフェースを実装するの場合、静的ではなく、これらのメソッドをpublicにするを宣言する必要があります。

_interface IStorable
{
     void Read( );
     void Write(object obj);
}
_

Read( )およびWrite( )IStorableメソッド宣言には、アクセス修飾子(publicprotected ..)が含まれていないことに注意してください。実際、アクセス修飾子を指定すると、コンパイルエラーが発生します。

_class Document : IStorable
{
     public void Read( )
     {
         //
     }
     public void Write(object obj)
     {
         //
     }
}
_

インターフェースをContractsとして実装し、publicとして実装することを考えてください。

0