Как реализовать абстрактный класс в Ruby?
Мне не нравится использовать abstract-classes абстрактные классы в Ruby ruby (почти всегда есть способ abstract-class лучше). Если вы действительно abstract-classes считаете, что это лучший abstract-class метод в данной ситуации, вы abstract-class можете использовать следующий abstract-class фрагмент, чтобы более четко ruby указать, какие методы являются 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-class просто вызываете abstract_methods
со списком abstract-class абстрактных методов, и когда abstract-classes они вызываются экземпляром abstract-class абстрактного класса, возникает abstract-classes исключение NotImplementedError
.
ruby
abstract-class
Как реализовать абстрактный класс в Ruby?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.