Ruby でインターフェースクラスを作る
Ruby
Published: 2019-06-10

やったこと

Ruby では下記のようなインターフェースがありません。

PHP: オブジェクト インターフェイス - Manual

そこで、Ruby でも似たようなことを実現する方法を試してみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

継承で実現する

main.rb

class MyInterface
  def hoge
    raise NotImplementedError.new("#{self.class}##{__method__} を実装してください")
  end
end

class SampleFailed < MyInterface
end

class SampleSuccess < MyInterface
  def hoge
    p "#{self.class}##{__method__}が実装されている!"
  end
end

SampleSuccess.new.hoge
SampleFailed.new.hoge

出力結果

$ ruby main.rb
"SampleSuccess#hogeが実装されている!"
Traceback (most recent call last):
	1: from main.rb:17:in `<main>'
main.rb:3:in `hoge': SampleFailed#hoge を実装してください (NotImplementedError)

Module で実現する

main2.rb

module MyInterface
  def hoge
    raise NotImplementedError.new("#{self.class}##{__method__} を実装してください")
  end
end

class SampleFailed
  include MyInterface
end

class SampleSuccess
  include MyInterface

  def hoge
    p "#{self.class}##{__method__}が実装されている!"
  end
end

SampleSuccess.new.hoge
SampleFailed.new.hoge

出力結果

$ ruby main2.rb
"SampleSuccess#hogeが実装されている!"
Traceback (most recent call last):
	1: from main2.rb:20:in `<main>'
main2.rb:3:in `hoge': SampleFailed#hoge を実装してください (NotImplementedError)

参考