21

私が理解しているように、インターフェイスは Java であり、インターフェイスを実装するクラスのメソッドを配置して埋めることによって設計を強制することを目的としています。これは Ruby モジュールのアイデアでもありますか? Java のインターフェイスと同じように、Ruby ではモジュールをインスタンス化できないことがわかりました。

4

5 に答える 5

17

短い答えはノーです。

理由は次のとおりです。Java/C# インターフェイスは、実装クラスが最低限提供するメソッド シグネチャを定義します。

さらに:

  • Ruby モジュールでは、ダックタイピングのため、そのような契約はありません。
  • モジュールは、簡単に再利用できるように共通の機能を抽出する方法にすぎません。最も近い関係は C# 拡張メソッドですが、これらは静的コンテキストに存在するため、完全には一致しません。
  • モジュールは、既存のクラスに状態を追加できます。
  • モジュールは静的メソッドを持つことができます
  • モジュールは名前空間として機能できます

例:

module SimpleConversation
  class NamespacedExample
    def poke
      puts "ouch"
    end
  end

  attr_accessor :partner_name
  def converse
    partner_name ||= "Slowpoke"
    speak + "\n#{partner_name}: Yes they are"
  end

  def self.yay
    puts "yay"
  end
end

class Foo
  include SimpleConversation
  attr_accessor :name

  def speak
    name ||= "Speedy"
    "#{name}: tacos are yummy"
  end
end

x = Foo.new
x.name = "Joe"
x.partner_name = "Max"
puts x.speak
puts x.converse

y = SimpleConversation::NamespacedExample.new
y.poke

SimpleConversation.yay
于 2009-02-26T05:40:55.897 に答える
7

私は、モジュールを C# の拡張メソッドに似たものと見なすと思います。実際には他の場所で定義されている既存のクラスに機能を追加しています。C# にも Java にも完全に類似したものはありませんが、インターフェイスだけでなく実装も派生しているため、インターフェイスとは絶対に考えません。

于 2009-02-22T22:13:10.287 に答える
4

Ruby のモジュールは、他のものに追加できるスコープ/名前空間のビットです。それらは、2 つの異なるが関連する目的で使用されます: 一緒に属する一連の関連するもの (定数、クラスなど) をまとめて、それらを他のスコープ (多重継承など) に追加することです。

たとえば、Comparable や Enumerable などと呼ばれるモジュールがあり、これらの形容詞が適用された場合に期待される機能をカプセル化します。基本的な定義 (Comparable の 2 つのインスタンスと Enumerable の反復子を比較するメソッド) を提供することで、モジュールをインポートして完全なインターフェイスを使用することができます。

一方、クラスに含めることはめったにないが、Net::HTTP、Net::FTP、Net::SMTP などの機能のバンドルを提供する Net のようなモジュールがあります。

中間には、何らかの方法で使用される可能性のある Math や Process などがあります。

-- マーカスQ

于 2009-02-26T05:22:49.217 に答える
3

いいえ。Ruby のモジュールは、静的クラスに似ています。私は Java 開発者ではありませんが、Java インターフェースは C# インターフェースに似ていると思います。つまり、Java インターフェースはコントラクトを定義しますが、実装は定義しません

私は ruby​​ の経験はありますが、それはビデオ ゲームの作成 (RGSS/2) です。私は、ベテランの Ruby プログラマーが知っている多くのことを知らないと確信しています。

于 2009-02-22T22:09:34.867 に答える
2

形式的な観点から見ると、Ruby のモジュールは「mixin」と呼ばれる設計パターンを実装しています。 http://en.wikipedia.org/wiki/Mixin

これは、PHP の特性と比較できます。 http://php.net/manual/en/language.oop5.traits.php

このようなアーキテクチャは、複数の継承が許可されていない言語 (Ruby、PHP など) で役立ちます。

于 2012-05-06T14:13:11.957 に答える