8

インターフェイス(またはすべてのメソッドを抽象化した抽象クラス)は、C#、JAVAなどの静的型付き言語の強力な武器です。これにより、さまざまな派生タイプを統一された方法で使用できます。デザインパターンは、可能な限りインターフェイスを使用することを推奨します。

ただし、動的型付け言語では、コンパイル時にすべてのオブジェクトの型がチェックされるわけではありません。特定の方法で使用するためにインターフェースを実装する必要はありません。いくつかのメソッド(属性)が定義されていることを確認する必要があります。これにより、インターフェースが不要になるか、少なくとも静的言語ほど有用ではなくなります。

典型的な動的言語(ルビーなど)にはインターフェースがありますか?もしそうなら、それを持っていることの利点は何ですか?そうでない場合は、インターフェイスを必要とする美しいデザインパターンの多くを失っていますか?

ありがとう。

4

3 に答える 3

2

すべての動的言語に単一の答えはないと思います。たとえば、Pythonにはインターフェースはありませんが、多重継承があります。インターフェイスのようなクラスを使用することは、依然として有用です。

  • インターフェイスのようなクラスは、メソッドのデフォルトの実装を提供できます。
  • ダックタイピングは良いですが、ある程度です。isinstance(x, SomeType)特に多くのメソッドSomeTypeが含まれている場合は、書き込みができると便利な場合があります。
于 2010-04-21T22:14:58.993 に答える
1

動的言語のインターフェースは、開発ツールや実行時のアサートなどによって自動的にチェックできるAPIのドキュメントとして役立ちます。

例として、zope.interfaceはPythonのインターフェースのデファクトスタンダードです。消費用に巨大なAPIを公開するZopeやTwistedなどのプロジェクトは便利ですが、私が知る限り、このタイプのプロジェクト以外ではあまり使用されていません。

于 2010-04-21T23:29:16.423 に答える
0

動的に型付けされた言語であり、単一の継承のみを許可するRubyでは、「インターフェイス」のメソッドでクラスを汚染するのではなく、ミックスインを介して「インターフェイス」を模倣できます。

ミックスインは部分的に多重継承を模倣し、オブジェクトが複数のソースから「継承」できるようにしますが、実際に複数の親を持つという曖昧さや複雑さはありません。本当の親は1人だけです。

インターフェイスを実装するには(静的に型付けされた言語のように実際のインターフェイスタイプではなく、抽象的な意味で)モジュールを静的言語のインターフェイスであるかのように定義します。次に、それをクラスに含めます。出来上がり!ダックタイプを本質的にインターフェイスであるものに集めました。

非常に単純化された例:

module Equippable
  def weapon
    "broadsword"
  end
end


class Hero
  include Equippable

  def hero_method_1
  end

  def hero_method_2
  end
end


class Mount
  include Equippable

  def mount_method_1
  end
end


h = Hero.new
h.weapon    # outputs "broadsword"


m = Mount.new
m.weapon    # outputs "broadsword"

Equippableは、Hero、Mount、およびそれを含むその他のクラスまたはモデルのインターフェースです。

(明らかに、武器は初期化子によって動的に設定される可能性が高く、この例では単純化されています。)

于 2014-05-16T12:27:31.040 に答える