私が間違っていない限り、インターフェイスの目的がどのようなものなのか完全にはっきりしていません。
OOPでは、インターフェイスには実装がありません。タイプは行います。したがって、インタフェースは、型がそれを実装しない限り、基本的に役に立たない。また、1つの型は他の1つの型だけを拡張できます。しかし、多くのインターフェースを実装することができます。
しかし、それは何を意味するのだ...
あなたは車、およびユーザーを持っていると言います。どのような実用的な方法でも同じであるとすぐには考えられない非常に異なるタイプです。 「ICarとIUserを作成する必要があります」と言う人もいます。しかし実際には、それはインタフェースについて考える実践的な方法ではありません。ユーザーがICarを実装するのは紛らわしく、ICarはCarと同じことをするようです。コードを見ている別のプログラマーとの違いは何でしょうか?
「自己記述可能」であることと、両方の情報を同じ方法で提供したいと思うとします。だから、あなたが作成したい:
Car implements ISelfDescribable {
getSelfDescription (return "I am a car!");
}
User implements ISelfDescribable {
getSelfDescription (return ...some other completely different way of getting the info...);
}
これらのオブジェクトの配列は、(あなたはインタフェースなしでこれを行うだろうどのように他を考える)、次のようになります:
今
ISelfDescribable {
getSelfDescription ();
}
を、あなたはこれを行うだろう
ここでは、具体的な型に関係なく、この配列内のオブジェクトがISelfDesribable
の「ビヘイビア」を実装するという事実を知っています。あなたがそれについて考えているなら、あなたがそれを実装していない限り、タイプが何であるかを知る必要は本当にありません。しかし、その振る舞いを実装するには型はまだ必要です。
これらのオブジェクトの両方が「Insurable」であることを望んだとします。彼らはどちらもメソッド、"setInsurancePolicy"
を持っている必要があります。 IInsurable { setInsurancePolicy (policy : Policy) }
を作成し、そのタイプで実装することができます。これでオブジェクトはISelfDescribable
とIInsurable
になりました。これらのオブジェクトの配列をどちらかとして入力できます。
私にとっては、大きな電球が私の周りに頭を抱えていたときに消えました:タイプ(およびタイプ階層)は具体的な事柄に関係するべきです。インタフェースは、異なるタイプ間で共有できるビヘイビアに関係している必要があります。これ以上のことはありますが、少なくともインターフェースやタイプを選択する理由についての考え方は少なくありません。たとえそうでなければ同じように見えても、それらはプログラミングの点で異なることを表しています。
(補足:Scalaのような言語は、このようにインターフェースに関しては考えませんが、 "behaviors"という概念はありますが、動作を実装してオーバーライドすることもできます。この特別な質問ですが、私はダンジョンのすべてのモンスターを殺す必要があります、クエストのものだけではありません)。