我知道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
,这将引发异常。
此外,模块不能被实例化,但也不能被继承。将新方法设为私有也不起作用。有什么建议吗?
发布于 2009-02-04 17:48:27
我不喜欢在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
异常。
发布于 2009-02-04 18:06:50
试试这个:
class A
def initialize
raise 'Doh! You are trying to instantiate an abstract class!'
end
end
class B < A
def initialize
end
end
发布于 2015-05-27 02:19:37
对于rails世界中的任何人来说,将ActiveRecord模型实现为抽象类都是通过模型文件中的以下声明完成的:
self.abstract_class = true
https://stackoverflow.com/questions/512466
复制相似问题