ruby 实现 abstract

作者:周星 发布:2017-10-07

    ruby 是一门动态语言,没有静态类型检查,有时为了设计模式或者代码复用,我们可能需要实现一个类似 java 中的 abstract 的类或者方法,首先我们来看如何实现一个 abstract 类。

    abstract 类只能被继承,不能用来初始化任何实例,所以我们可以这样定义父类的 initialize 方法

class Father
  def initialize
    raise 'Can not instantiate an abstract class'
  end
end

这样当我们试图使用 Father 类初始化一个实例时,就会抛出异常。

当然我们也可以在 new 方法上做一些手脚:

class Father
  private_class_method :new

  def initialize
    p 'you can not see me(Father)'
  end
end

class Child < Father
  public_class_method :new

  def initialize
    p 'you can see me(Child)'
  end
end

Child.new
Father.new

这种实现方式要求所有子类中必须声明 new 方法为 public 方法,而且相比而言不太好理解。

同理,如果想声明一个 abstract 方法,只要在方法体中 raise error 即可。

class Father
  def a
    raise 'I am an abstract method, implement me in the subclass'
  end
end

当然我们可以封装成一个 module

module Abstract
  extend ActiveSupport::Concern

  included do
    def self.abstract_methods(*methods)
      methods.each do |method_name|
        define_method method_name do
          raise NotImplementedError, 'This is an abstract base method. Implement in your subclass.'
        end
      end
    end
  end
end

然后这样使用它:

class Father
  include Abstract
  abstract_methods :initialize
end

如果您对本文有什么意见或建议,请联系博主

支付宝扫码赞助博主


评论(0)