Ruby には、他の言語と同じようにインターフェースがあります。
ユニットの責任、保証、およびプロトコルの抽象的な仕様であるInterfaceinterfaceの概念を、Java、C#、および VB.NET プログラミングのキーワードであるの概念と混同しないように注意する必要があります。言語。Ruby では、前者は常に使用されますが、後者は単に存在しません。
両者を区別することは非常に重要です。重要なのはInterfaceであり、 ではありませんinterface。は、interfaceほとんど役に立たないことを伝えます。メンバーをまったく持たないインターフェイスである Javaのマーカー インターフェイスほど、これをよく示しているものはjava.io.Serializableありませんjava.lang.Cloneable。これら 2 つの は非常に異なるinterface意味を持っていますが、まったく同じ署名を持っています。
では、異なる意味を持つ2 つinterfaceの s が同じ署名を持っている場合、偶数は正確interfaceに何を保証するのでしょうか?
別の良い例:
interface ICollection<T>: IEnumerable<T>, IEnumerable
{
void Add(T item);
}
のインターフェースはSystem.Collections.Generic.ICollection<T>.Add何ですか?
- コレクションの長さが減らないこと
- 以前コレクションにあったすべてのアイテムがまだそこにあること
- それ
itemはコレクションにある
そして、それらのどれが実際に表示されinterfaceますか? なし!メソッドが追加しなければならないinterfaceということは何もありません。コレクションから要素を削除することもできます。Add
これはその完全に有効な実装ですinterface:
class MyCollection<T>: ICollection<T>
{
void Add(T item)
{
Remove(item);
}
}
もう 1 つの例:それがsetjava.util.Set<E>であると実際に言っているのはどこでしょうか? どこにも!より正確には、ドキュメントで。英語で。
interfacesJava と .NET の両方のほとんどすべてのケースで、すべての関連情報は実際には型ではなくドキュメントにあります。では、とにかくタイプが興味深いことを何も教えてくれないのなら、なぜそれらを保持する必要があるのでしょうか? ドキュメントだけに固執しないのはなぜですか?それがまさに Ruby が行うことです。
インターフェイスを実際に意味のある方法で記述できる言語が他にもあることに注意してください。ただし、これらの言語は通常、インターフェイスを記述する構成要素を呼び出さず、 " " と呼びます。依存型プログラミング言語では、たとえば、関数が元のコレクションと同じ長さのコレクションを返す、元のすべての要素が並べ替えられたコレクションにもある、それよりも大きな要素が前に現れない、というプロパティを表現できます。より小さな要素。interfacetypesort
要するに、Ruby には Java に相当するものはありませんinterface。ただし、 Java Interfaceに相当するものがあり、Javaのドキュメントとまったく同じです。
また、Java と同様に、Acceptance Testsを使用してInterfaceを指定することもできます。
特に、Ruby では、オブジェクトのインターフェイスは、何ができるかclass、または何が混ざるかではなく、何ができるかによって決定されmoduleます。メソッドを持つ任意のオブジェクト<<に追加できます。これは、より複雑な の代わりにまたはArrayを単純に渡すことができる単体テストで非常に便利です。StringLoggerArrayLoggerinterface<<
別の例はStringIOで、これは と同じインターフェースを実装しているため、 のインターフェースのIO大部分を実装していますが、 以外に共通の祖先を共有していません。FileObject