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>
であると実際に言っているのはどこでしょうか? どこにも!より正確には、ドキュメントで。英語で。
interfaces
Java と .NET の両方のほとんどすべてのケースで、すべての関連情報は実際には型ではなくドキュメントにあります。では、とにかくタイプが興味深いことを何も教えてくれないのなら、なぜそれらを保持する必要があるのでしょうか? ドキュメントだけに固執しないのはなぜですか?それがまさに Ruby が行うことです。
インターフェイスを実際に意味のある方法で記述できる言語が他にもあることに注意してください。ただし、これらの言語は通常、インターフェイスを記述する構成要素を呼び出さず、 " " と呼びます。依存型プログラミング言語では、たとえば、関数が元のコレクションと同じ長さのコレクションを返す、元のすべての要素が並べ替えられたコレクションにもある、それよりも大きな要素が前に現れない、というプロパティを表現できます。より小さな要素。interface
type
sort
要するに、Ruby には Java に相当するものはありませんinterface
。ただし、 Java Interfaceに相当するものがあり、Javaのドキュメントとまったく同じです。
また、Java と同様に、Acceptance Testsを使用してInterfaceを指定することもできます。
特に、Ruby では、オブジェクトのインターフェイスは、何ができるかclass
、または何が混ざるかではなく、何ができるかによって決定されmodule
ます。メソッドを持つ任意のオブジェクト<<
に追加できます。これは、より複雑な の代わりにまたはArray
を単純に渡すことができる単体テストで非常に便利です。String
Logger
Array
Logger
interface
<<
別の例はStringIO
で、これは と同じインターフェースを実装しているため、 のインターフェースのIO
大部分を実装していますが、 以外に共通の祖先を共有していません。File
Object