我不喜欢在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
异常。
模块可以混入,但我认为你需要经典继承的其他原因? – Zach 2009-02-04 17:41:44
这并不是说我需要实现一个抽象类。我想知道如何去做,如果有需要的话。一个编程问题。而已。 – Chirantan 2009-02-04 17:46:27
'raise'Doh!你正试图在Ruby中编写Java``。 – 2011-08-14 23:30:46