ruby中的抽象方法(> = 2.2.0)……它们是否存在?

我正在为接口编写基类。我希望所有inheritance的类实现一些方法,有没有办法让它们成为现实?

我有一个payment_method_base类,我将inheritance。

我希望我所有的payment_method类都实现方法kind() ,它将返回一个字符串,例如'credit_card''braintree''paypal''amazon_pay' ……

有没有办法确保从payment_method_baseinheritance的类被强制实现方法kind()

请记住,新的payment_method类的创建者在创建类之前可能不知道这些要求。

在java中,这些称为抽象方法。 我想知道ruby是否有类似的东西? https://github.com/shuber/defined/blob/master/lib/defined.rb

—-进化
我想知道是否已经修复了允许抽象方法的语言。

—-部分答案这个答案可能是添加我需要的钩子的线索。 是否有类似于inheritance的类#的钩子只在Ruby类定义之后触发?

这并不像我预期的那样工作。 呼叫似乎没有在正确的时间完成。 即便如此,有多少gem处理它。 https://github.com/shuber/defined/blob/master/lib/defined.rb


简单地回答我不能提交,因为这是一个没有真正答案的问题的重复。

 def self.abstract(*methods_array) @@must_abstract ||= [] @@must_abstract = Array(methods_array) end def self.inherited(child) trace = TracePoint.new(:end) do |tp| if tp.self == child #modules also trace end we only care about the class end trace.disable missing = ( Array(@@must_abstract) - child.instance_methods(false) ) raise NotImplementedError, "#{child} must implement the following method(s) #{missing}" if missing.present? end end trace.enable end abstract :foo 

Ruby并没有真正实现类似接口的任何东西,因为它违背了它的理念,但如果你真的想模拟接口,你可以使用一些gem,例如https://github.com/djberg96/interface 。

ruby中没有抽象方法。

我想你可以实现这样的方法,我不时看到它:

 def some_method raise "This method should be over-ridden by a sub-class" end 

如果一个子类忽略了实现该方法 – 它将不会在’编译时’捕获,因为这不会发生在ruby中。 但如果有人试图调用尚未实现的方法,则会引发exception。

当然,如果你没有在“抽象”超类中放置那个方法(这不是多于提升),并且在没有子类实现它的子类上调用它…你仍然会得到它无论如何都会引发NoMethodException。 因此,“抽象”方法实现除了提高之外不会增加太多。 也许是意图的文件。

我认为处理这种问题的最类似ruby的方法可能是提供某种类型的测试套件,另一个实现子类的开发人员可以轻松地对其子类进行操作。 如果子类没有实现它应该实现的东西,测试套件会抱怨 – 它甚至可以超越方法签名,并确保子类的语义也是预期的(你不能这样做)只使用Java中的方法签名!)。 我实际上并没有看到过任何人这样做,但他们经常认为这是有意义的。