首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ruby中实现抽象类?

如何在ruby中实现抽象类?
EN

Stack Overflow用户
提问于 2009-02-05 01:35:43
回答 15查看 101.1K关注 0票数 129

我知道ruby中没有抽象类的概念。但是,如果它真的需要实现,该怎么做呢?我试过像这样的..。

代码语言:javascript
复制
class A
  def self.new
    raise 'Doh! You are trying to write Java in Ruby!'
  end
end

class B < A
  ...
  ...
end

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

此外,模块不能被实例化,但也不能被继承。将新方法设为私有也不起作用。有什么建议吗?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2009-02-04 17:48:27

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

代码语言:javascript
复制
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异常。

票数 61
EN

Stack Overflow用户

发布于 2009-02-04 18:06:50

试试这个:

代码语言:javascript
复制
class A
  def initialize
    raise 'Doh! You are trying to instantiate an abstract class!'
  end
end

class B < A
  def initialize
  end
end
票数 46
EN

Stack Overflow用户

发布于 2015-05-27 02:19:37

对于rails世界中的任何人来说,将ActiveRecord模型实现为抽象类都是通过模型文件中的以下声明完成的:

代码语言:javascript
复制
self.abstract_class = true
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/512466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档