Techioz Blog

Rubyで抽象クラスを実装する方法

概要

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 が呼び出され、例外が発生します。

また、モジュールはインスタンス化できませんが、継承することもできません。新しいメソッドをプライベートにしても機能しません。

誰かが何か指針を持っていますか?

解決策

ここで遅ればせながら言っておきますが、特に抽象クラスにメソッドをその場で追加できるため、誰かが抽象クラスをインスタンス化するのを止める理由はないと思います。

Ruby のようなダックタイピング言語は、実行時のメソッドの有無や動作を使用して、メソッドを呼び出す必要があるかどうかを決定します。したがって、抽象メソッドに適用されるあなたの質問は理にかなっています

def get_db_name
   raise 'this method should be overriden and return the db name'
end

それが物語の終わりのはずです。 Java で抽象クラスを使用する唯一の理由は、特定のメソッドが「埋められる」一方、他のメソッドの動作は抽象クラス内で行われるようにすることです。アヒルタイピング言語では、クラスや型ではなくメソッドに焦点が当てられるため、心配はそのレベルに移す必要があります。

あなたの質問では、基本的に Java から抽象キーワードを再作成しようとしています。これは、Ruby で Java を実行するためのコードの匂いです。