38

メソッドを実装するときinterface、私はそれをメソッドにすることを余儀なくされpublicます。

default(同じパッケージ内のアクセスの場合のように)またはのいずれかを使用したい場合がありますprotected

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

4

5 に答える 5

59

インターフェースは、あるタイプのパブリックAPIを定義することを目的としており、その実装ではなく、それだけを定義します。したがって、インターフェースで定義するメソッド(または静的メンバー)は、定義上publicです。

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

于 2012-03-08T08:30:57.327 に答える
12

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

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

特定のプライベートメソッドのセットを誰かにオーバーライドさせたい場合は、一連の抽象保護されたメソッドを使用して抽象クラスを宣言することをお勧めします。

于 2012-03-08T08:31:48.370 に答える
1

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

于 2012-03-08T08:33:40.773 に答える
0

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

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

interface IStorable
{
     void Read( );
     void Write(object obj);
}

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

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

インターフェイスを次のように実装されるコントラクトと考えてください。public

于 2014-03-24T16:46:00.203 に答える
-1
  1. インターフェイスメソッドをプライベートとしてマークすると、実装クラスはメソッドを認識せず、オーバーライドできません。

  2. インターフェイスメソッドを保護済みとしてマークすると、実装クラスは、インターフェイスと同じパッケージに含まれていない限り、メソッドを認識しません。

  3. アクセス修飾子なしでインターフェイスメソッドをマークすると、実装クラスは 、インターフェイスと同じパッケージに含まれて
    いない限り、メソッドを認識しません。

于 2016-06-14T10:34:49.143 に答える