[解決済み] Rubyでjavaのインターフェースに相当するものは何ですか?
質問
RubyでもJavaのようにインターフェースを公開し、Rubyモジュールやクラスがインターフェースで定義されたメソッドを実装するように強制することができますか?
継承とmethod_missingで実現する方法もありますが、他にもっと適切な方法はないのでしょうか?
どのように解決するのですか?
Rubyには インターフェイス があります。
の概念を混同しないように注意する必要があります。
インターフェース
という概念を混同しないように注意する必要があります。
interface
という概念と、Java、C#、VB.NETなどのプログラミング言語におけるキーワードである
この2つを区別することは非常に重要です。重要なのは
インターフェース
ではなく
interface
. また
interface
はほとんど何も教えてくれません。このことをよりよく表しているのは
マーカーインターフェース
を見てみてください。
java.io.Serializable
と
java.lang.Cloneable
この2つの
interface
の意味は
非常に
を意味し、かつ
全く同じ
の署名があります。
ですから、もし二つの
interface
が同じシグネチャを持つ場合、どのような
まさに
は
interface
が保証してくれるのでしょうか?
もう一つの良い例です。
package java.util;
interface List<E> implements Collection<E>, Iterable<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException;
}
は何ですか?
インターフェース
の
java.util.List<E>.add
?
- コレクションの長さが減少しないように
- 以前からコレクションにあったすべてのアイテムがまだそこにあること
-
その
element
がコレクションに含まれている
で、実際に表示されるのはどれかというと
interface
? ありません! の中には何もありません。
interface
には何も書かれていません。
Add
メソッドは
を追加する
を追加する必要がありますが、それよりも
を削除する
をコレクションから削除するのと同じです。
これは完全に有効な実装で、その
interface
:
class MyCollection<E> implements java.util.List<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException {
remove(element);
}
}
別の例として
java.util.Set<E>
と書いてあるのでしょうか?
セット
? どこにもありません! 正確には、ドキュメントに。英語では
のかなり多くのケースで
interfaces
の場合、Javaと.NETの両方から、すべての
関連する
の情報は、実は型の中ではなく、ドキュメントの中にあるのです。では、もし型が何も面白いことを教えてくれないのであれば、なぜそれを維持するのでしょうか?なぜドキュメントだけにこだわらないのでしょうか?そして、それはまさにRubyが行っていることです。
があることに注意してください。
他の
が使用できる言語があります。
インターフェース
は実際に意味のある方法で記述することができます。しかし、それらの言語では一般的に
インターフェース
"です。
interface
と呼ばれています。
type
. 依存型プログラミング言語では,たとえば
sort
関数は元のコレクションと同じ長さのコレクションを返し、 元のコレクションにある全ての要素はソートされたコレクションにもあり、 小さい要素の前に大きい要素が現れないという特性を表現することができます。
要するに、RubyにはJavaの
interface
. それは
は
しかし、Java の
インターフェース
に相当するものがあり、それはJavaと全く同じものです:ドキュメントです。
また、Javaと同じように 受入テスト を指定することができます。 インターフェイス を指定することもできます。
特に、Rubyでは
インターフェース
は、そのオブジェクトができること
できること
で決まるのであって
class
が何であるか、あるいは
module
に混じる。を持つオブジェクトはすべて
<<
メソッドを持つ任意のオブジェクトに付加することができます。これはユニットテストでは非常に便利で、単に
Array
または
String
の代わりに、より複雑な
Logger
であっても
Array
そして
Logger
は、明示的な
interface
というメソッドを持っていることを除けば、両者は明示的に
<<
.
他の例として
StringIO
を実装しており、同じ
インターフェース
として
IO
というように、大部分は
インターフェース
の
File
の他に共通の祖先を持たないが
Object
.
関連
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] いつ使うか。Java 8+のインターフェイスのデフォルトメソッドと、抽象的なメソッドの比較
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] Typescript によるインターフェース型チェック
-
[解決済み】PHPのインターフェイスのポイントは何ですか?
-
[解決済み】Java パラメータとしてメソッドを渡す
-
[解決済み] なぜsumはinject(:+)よりもずっと速いのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン