インターフェイスは契約です。クラスがインターフェースを実装する場合、これはクラスがインターフェースに記述されているすべての操作を完全にサポートしていることを意味します。 (これはではありませんが、常にの場合です)。タイトルのステートメントについて:一般的に、名前が「-able」で終わるすべてのインターフェイスは、クラスを何かできることとしてマークします。例:Runnableを - run()
、実行 -、同等 - compareTo()
など
A)
public interface Openable {
void open();
}
上記インタフェースが実際にそれを実装する任意のクラスを開くことができることを意味するものではないに関係なく、コールコンテキストの。それは必ずしもオブジェクトが開くことを意味するわけではありませんが、それはポイントではありません。
の@ sgj88_によって提案されているように、次のことを考えてみます。
B)
public interface Openable {
void open(Opener opener);
}
あなただけOpener
がOpenable
オブジェクトを開くことができると述べているので、理論的にはこれは良いオプションです。 (理想的には、オブジェクトは他のオブジェクトではなく自分の内部構造を変更するだけです)。しかし実際には、Opener
は振る舞いを変更するオブジェクトのように振る舞います。
public interface Opener {
// or something similar
double fractionToOpen();
Opener FULL_OPENER =() -> 1.0;
Opener HALF_OPENER =() -> 0.5;
}
この理由は、名前はそれがないことを示唆しながらOpener
は、その状態を変更するために、Openable
の内部については何も知らないということです。 open()
はOpener
にありません。最初はOpener
が必要ないためです。したがって、設計と実装のセマンティクスは一致しません。
C)
のみOpener
タイプは、それらを開くことができるので、open()
にちょうど単一の呼び出しよりOpenable
の状態を変更する複数の方法があると仮定することができます。 次に、Openable
は、その内部状態を変更するためのより多くの方法を必要とする。
setOpenRate(), setOpenFraction()
など
このケースではありませんし、質問には、すなわち、コール特権を参照している場合open()
が使用できる単一のクラスOpener
が存在する場合、それはインタフェースであってはなりません。
おそらく、インターフェイスが設計されているいくつかのコンテキストがあれば、最適なオプションを特定するのに役立つでしょう。
もし 'Openable'が単一の' open'メソッドを持つのと同じくらい簡単なら、なぜあなたは 'Opener'を必要としますか? –
'オープナー'はオープンするために 'オープン 'とどうやりとりしますか? 'Openable'で' open'メソッドしか呼び出していない場合、なぜ 'Opener'が必要ですか? – plalx