如何在Ruby中实现抽象类 [英] How to implement an abstract class in Ruby

查看:9
本文介绍了如何在Ruby中实现抽象类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道Ruby中没有抽象类的概念。但如果它需要实施,我该如何着手呢?我尝试了这样的操作:

class A
  def self.new
    raise 'Doh! You are trying to write Java in Ruby!'
  end
end

class B < A
  ...
  ...
end

但是,当我尝试实例化B时,它将在内部调用A.new,从而引发异常。

此外,模块不能被实例化,但也不能被继承。将新方法设置为私有也不起作用。

有没有人有什么建议?

Ruby

我不喜欢在推荐答案中使用抽象类(几乎总是有更好的方法)。但是,如果您真的认为这是最适合这种情况的技术,您可以使用以下代码片段来更明确地说明哪些方法是抽象的:

module Abstract
  def abstract_methods(*args)
    args.each do |name|
      class_eval(<<-END, __FILE__, __LINE__)
        def #{name}(*args)
          raise NotImplementedError.new("You must implement #{name}.")
        end
      END
      # important that this END is capitalized, since it marks the end of <<-END
    end
  end
end

require 'rubygems'
require 'rspec'

describe "abstract methods" do
  before(:each) do
    @klass = Class.new do
      extend Abstract

      abstract_methods :foo, :bar
    end
  end

  it "raises NoMethodError" do
    proc {
      @klass.new.foo
    }.should raise_error(NoMethodError)
  end

  it "can be overridden" do
    subclass = Class.new(@klass) do
      def foo
        :overridden
      end
    end

    subclass.new.foo.should == :overridden
  end
end

基本上,您只需使用抽象的方法列表调用abstract_methods,当它们被抽象类的实例调用时,将引发NotImplementedError异常。

这篇关于如何在Ruby中实现抽象类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆