Как реализовать абстрактный класс в 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

2022-11-12T09:18:13+00:00
Вопросы с похожей тематикой, как у вопроса:

Как реализовать абстрактный класс в Ruby?