Ruby で抽象クラス ソリューションにアプローチする正しい方法は何ですか?
概要
抽象クラスが Ruby の機能ではないことはわかっており、その背後には確かに哲学的な理由があるのですが、C++ や Java などの他の言語では抽象クラスを使用して通常解決される問題にアプローチする方法があるかどうか知りたいです。
例えば: Triangle、Square、Circle の 3 つのクラスが必要です。これらはすべて幾何学的図形であるため、抽象メソッド get_area を使用して AbstractFigure という抽象クラスをコーディングすることを考えていました。このクラスは、具象クラス Triangle、Square、Circle によって実装されます。
Ruby の哲学に従ってこれを行うにはどうすればよいでしょうか?
解決策
Java のような頻繁に使用される他の言語とは異なり、Ruby には明確に定義された概念として存在しないというのは正しいことです。
しかし、それが正当化される状況がたくさんあるということもまた正しいのです。
あなたの例を使用して、私がそれをどのように行ったかは次のとおりです -
class AbstractShape
attr_accessor :edges
def initialize
# ...
end
def get_area
raise NoMethodError("Override this implementation")
end
end
class Square < AbstractShape
def initialize
# square-specific stuff
super
end
def get_area
self.edges * foo * bar
end
end
重要なのは、可読性と一貫性を確保するために、使用可能なすべてのメソッドを最上位で定義することですが、使用した場合は必ずエラーを発生させるようにしてください。
すべてのシェイプで一貫して同じ方法で使用されることが確実なメソッドがある場合は、それを AbstractShape で定義します。
attr_accessor も継承するため、各シェイプのインスタンスごとに @edge を使用できるようになります。ただし、正しいローカル インスタンス変数を使用するだけなので、AbstractShape クラス内に @edges を参照するメソッドを含めることはできます。