2017-03-04 143 views
1

我目前正在開發一個基於用戶電子郵件地址域的許多其他提供程序進行身份驗證的中央身份驗證API(在Ruby on Rails中)。有沒有辦法在Ruby中強制實現接口方法?

如果我使用java,這將是一個經典的接口用例。鑑於我正在使用Ruby,我仍然想使用接口構造,但並不確定如何執行接口方法。

這個接口的意圖是有一個authenticated?方法,至少現在。

一個示例實現。它在本地數據庫中驗證用戶身份。

# 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 

所以,當我對我的API添加更多供應商支持(即實現此接口的多個類),我如何確保這些新類要實現這個接口,換句話說,確保authenticated?方法已經實施?

+0

看看這篇文章:http://shiroyasha.io/ interfaces-in-ruby.html –

+0

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

感謝您的回答。我能夠使用duck-typing來強制實現方法 – grizzthedj

相關問題