16

私は次のクラスを持っています:

CachedObject
CachedObjectSource
CachedObjectDbSource < CachedObjectSource
CachedObjectDalliSource < CachedObjectSource

CachedObject は、サードパーティの API から取得され、ローカルに保存される非データベース オブジェクトです。CachedObject はデータベースと Dalli (memcache) の両方に格納され、リアルタイム コードは Dalli ソースにオブジェクトのコピーを ping し、Dalli ソースはデータベース ソースを検索し、オブジェクトが存在しない場合はそのキャッシュを更新します。 . したがって、CachedObjectSource の各子クラスが同じメソッド セットを実装する必要があるネストされた呼び出しです。IE、インターフェイス。

子クラスがインターフェイスを実装する必要があるように CachedObjectSource クラスを記述する方法はありますか? 私はこれについて間違った方法で進んでいますか?

4

3 に答える 3

23

Ruby は、例えば Java に似たインターフェースを認識していません。代わりに、Ruby プログラムは通常、ダック タイピングと呼ばれるアプローチを使用します。これは、基本的に、任意のメッセージを任意のオブジェクトに送信して、それに応答するかどうかを決定できることを意味します。つまり、各オブジェクトは、どのメソッドを持つかを独自に決定します。

「インターフェイス」に最も近いものは、メソッドを実装するクラス (またはモジュール) ですが、次のNotImplementedErrorようなものしか発生しません。

class CachedObjectSource
  def my_method
    raise NotImplementedError, "Implement this method in a child class"
  end
end

そうすれば、メソッドが存在し、子クラスで上書きされることなく呼び出されると、適切なエラーが返されます。次に、準拠するためにどの子クラスを実装する必要があるかを明確にするドキュメントを作成する必要があります。

于 2013-09-11T15:51:22.287 に答える
3

gemインターフェイスを使用できます。
この gem は、Java インターフェースに似たインターフェースをエミュレートします。
例えば:

require 'interface'

MyInterface = interface{
  required_methods :foo, :bar, :baz
}

# Raises an error until 'baz' is defined
class MyClass
  def foo
    puts "foo"
  end

  def bar
    puts "bar"
  end

  implements MyInterface
end

アブストラクトジェムと合わせて重宝するこのジェム。
Abstract gem は抽象メソッドを提供します。

于 2015-07-16T20:20:08.443 に答える