2017-03-10 7 views
0

私は次のような状況があります、私はBまたはCを実装するクラスを使用することができます。しかし、私が使用するコード、「a.doSomethingCoolを()」の部分がある私のアプリケーションでインターフェイスが実装されないようにすることはできますか?

public interface A { 
    void doSomethingCool(); 
} 

public interface B extends A { 
    void doSomethingVeryBCool(); 
} 
public interface C extends A { 
    void doSomethingVeryCCool(); 
} 

を理由どの実装が使用されているのかわかりません(気にしません)。

BとCの実装のみが存在することを強制できますか? または、インターフェイスAが実装されないようにしますか?そのパッケージ外のクラスがインターフェイスを見ることができない

interface A {...} //no public 

この方法:あなたが直接インタフェース実装されていないを強制することはできません

+0

私はあなたができるとは思わない。私はあなたがしたいとは思わない。アスペクトを使用して実行時に巧妙なことをすることができるかもしれませんが、私があなたのライブラリのクライアントであった場合、自分の選択を制限することに満足できません。あなたができることはドキュメントです。 – duffymo

+1

いいえあなたはできません... –

+0

もしあなたが同様のものを入手したいと思ったら。 Aを抽象クラスにして、 "A"から直接拡張するという悲惨な結果を示すExceptionを投げることができます。人々はそうでなければ単に例外をキャッチし、あなたの警告を無視するので、彼らは怖いです。それ以外は、デザインを変更することを検討してください。 – Edd

答えて

4

、しかし、あなたは、インタフェースパッケージローカルを作ることができます。

EDIT:しかし、これは解決できないので、あなたがパッケージ外部

A a = getA(); 

ような何かをすることができないということを意味します。

+0

あなたは天才です!それはとても簡単です!これは実際に "クラスFooはAを実装する"の使用を妨げます 私は決して考えなかったでしょう、インタフェースがパッケージで保護されることができます。ありがとうございました! – trapzerapzerix

関連する問題