インターフェースは、Java などの静的言語に、ある程度の動的言語のような柔軟性を実際に追加します。これらは、実行時に実装するコントラクトのオブジェクトを照会する方法を提供します。
その概念は、動的言語にうまく移植されます。もちろん、「動的」という言葉の定義によっては、Cocoa でプロトコルをかなり広範に利用する Objective-C も含まれます。
Ruby では、オブジェクトが特定のメソッド名に応答するかどうかを尋ねることができます。しかし、それはあなたが望むことをするというかなり弱い保証です。特に、何度も何度も使用される単語が少ないこと、完全なメソッド署名が考慮されていないことなどを考えると.
Rubyで私は尋ねるかもしれません
object.respond_to? :sync
それで、ええ、それが意味するものは何でも、「同期」という名前のメソッドがあります。
Objective-C では、似たような質問をするかもしれません。つまり、「これは、同期する何かのように見える/歩く/クワックしますか?」:
[myObject respondsToSelector:@selector(sync)]
さらに良いことに、いくらか冗長ではありますが、より具体的な質問をすることができます。つまり、「これは、MobileMe に同期する何かのように見えますか?
[myObject respondsToSelector:@selector(sync:withMobileMeAccount:)]
それは種のレベルまでダックタイピングです。
しかし、MobileMe への同期の実装が約束されているかどうかを実際にオブジェクトに尋ねるには...
[receiver conformsToProtocol:@protocol(MobileMeSynchronization)]
もちろん、プロトコル/ダックの定義と見なす一連のセレクターの存在と、それらが十分に具体的であるかどうかをチェックするだけで、プロトコルを実装できます。どの時点で、プロトコルは醜いresponds_toの大きな塊の単なる省略形ですか? クエリ、およびコンパイラ/IDE が使用するための非常に便利な構文シュガーが含まれています。
インターフェイス/プロトコルは、オブジェクト メタデータの別の次元であり、これらのオブジェクトの処理で動的な動作を実装するために使用できます。Java では、コンパイラはたまたま、通常のメソッド呼び出しに対してそのようなことを要求します。しかし、Ruby、Python、Perl などの動的言語でさえ、「オブジェクトが応答するメソッド」を超えた型の概念を実装しています。したがって、class キーワードです。Javascript は、その概念を持たない唯一の一般的に使用されている言語です。クラスがある場合は、インターフェイスも意味があります。
確かに、ほとんどのアプリケーション コードよりも複雑なライブラリやクラス階層の場合に便利ですが、この概念はどの言語でも役立つと思います。
また、他の誰かがミックスインについて言及しました。Ruby ミックスインは、コードを共有する方法です。たとえば、クラスの実装に関連しています。インターフェイス/プロトコルは、クラスまたはオブジェクトのインターフェイスに関するものです。それらは実際に互いに補完することができます。動作を指定するインターフェイスと、オブジェクトがその動作を実装するのに役立つ 1 つ以上の mixin がある場合があります。
もちろん、両方の言語を明確に第一級の言語機能として備えている言語は考えられません。ミックスインを使用する場合、通常、ミックスインを含めることは、それが実装するインターフェースを意味します。