インターフェイスのメソッドが常に公開されるのはなぜですか? なぜ彼らはプライベートになれないのですか?
3 に答える
インターフェイスのすべてのメソッドが公開されているためです。これがインターフェイスを持つポイントです。技術的には、クラスのコントラクトを定義します (これには、多くの重複するコントラクト/インターフェイスがある場合があります)。クラスのクライアントは、インターフェイスへの参照を保持し、インターフェイスを介してクラスの公開 (パブリック) メソッドにのみアクセスできる必要があります。
なぜそうなのですか?
JLSがそう言っているからです:
インターフェース宣言に関する章で、JLS 9.4は次のように述べていますpublic
。
クラス宣言に関する章で、JLS 8.4.8.3は次のように述べています。
エンジニアのドレリーの答えは、言語がこのように設計されている理由を説明しています。
このように宣言されたインターフェースを参照していると思います:
public interface MyInter
{
public void myFunc();
}
public
実装で修飾子を省略した場合の結果のエラー:
MyClass.java:3: myFunc() in MyClass cannot implement myFunc() in MyInter; attempting to assign weaker access privileges; was public
void myFunc(){}
^
myFunc
プライベートにできると言ってください。次のコードを別のクラスに記述します。これは、アクセス権のないプライベート関数を使用しようとしていることに文句を言う必要があります。
MyClass foo = new MyClass();
foo.myFunc(); // Declared private, can't call it.
しかし、これはどうですか:
void doSomething(MyInter foo)
{
foo.myFunc(); // Declared public in interface, private in implementation.
}
これはできますか?インターフェースによると、これは public メソッドなので、準備ができているはずです。しかし、これはプライベート メソッドとして実装されているため、クラスは、このように外部から呼び出されることは決してないことを期待しています。これは、コンパイラによって強制されるべき制限です。MyClass
しかし、コンパイラはこれをコンパイルするために知る必要さえありません。それはまだ書かれていないか、統合されるかもしれないし、統合されないかもしれない外部ライブラリでさえ書くことができませんでした。
実装を許可すると、許可されるアクセスのルールに内部矛盾が生じます。この矛盾の解決策は、状況を完全に許可しないことです。インターフェイスでメソッドを呼び出すことができるものは、どの実装でも呼び出すことができる必要があります。
サブクラスのメソッドをオーバーライドする場合も、同じ引数が当てはまります。より制限的な修飾子でオーバーライドしてそれらを「隠す」ことはできません。