2017-03-04 24 views
1

私は現在、ユーザーの電子メールアドレスのドメインに基づいて他の多くのプロバイダで認証される中央認証API(Ruby on Rails)を開発中です。Rubyでインタフェースメソッドの実装を強制する方法はありますか?

私がjavaを使用していた場合、これはインターフェイスの古典的な使用例です。私がRubyを使用していることを考えれば、私はまだインタフェース構造を使用したいと思いますが、インタフェースメソッドの実装を強制する方法は本当にわかりません。

このインターフェイスの目的は、今のところ少なくとも1つのauthenticated?メソッドを持つことです。

実装の例。ローカルデータベースのユーザーを認証します。私は私のAPI(このインタフェースを実装すなわち複数のクラス)に多くのプロバイダのサポートを追加したとき

# internal_user.rb 
class InternalUser < User 
    def authenticated?(email, password) 
    user = User.find_for_database_authentication(email: email) 
    user && user.valid_password?(password) && !user.confirmed_at.nil? 
    end 
end 

だから、どのように私はこれらの新しいクラスは、このインタフェースを実装しようとしていることを確認することができ、言い換えれば、そのauthenticated?確保メソッドが実装されていますか?

+0

この記事を見てみましょう:http://shiroyasha.io/をinterfaces-in-ruby.html –

+0

Rubyには抽象クラス、メソッド、インタフェースはありませんが、本当に必要な場合はRubyに構築するツールが用意されています。しかし最後にYAGNI。 – max

答えて

3

RubyにはJavaに似たインタフェースはありません。 duck-typingでは、メソッドコールに応答するかどうかは、各クラスに依存します。

あなたは方法は、サブクラスで実装する必要があることを示したい場合は、親メソッドで例外を上げることができる:

class User 
    def authenticated?(*p) 
    raise NotImplementedError, "IMPLEMENT ME IN #{self.class}##{__method__}" 
    end 
end 

class InternalUser < User 
end 

InternalUser.new.authenticated?('user', '[email protected]') 
#interface.rb:3:in `authenticated?': IMPLEMENT ME IN InternalUser#authenticated? (NotImplementedError) 
+0

あなたの答えをありがとう。私はダックタイピングを使ってメソッドの実装を強制することができました – grizzthedj

関連する問題