質問
は、RubyにC ++の十年からの移行に私の探求では、私は自分自身が第二単純なことを達成する方法を推測見つけます。これは、「Rubyの道」である場合は、以下の古典的な形状の導出例考えると、私は思ったんだけど。私は以下のコードで、本質的に間違って何もないと考えているが、私はルビーのフルパワーを活用いないよ感じを残しています。
class Shape
def initialize
end
end
class TwoD < Shape
def initialize
super()
end
def area
return 0.0
end
end
class Square < TwoD
def initialize( side )
super()
@side = side
end
def area
return @side * @side
end
end
def shapeArea( twod )
puts twod.area
end
square = Square.new( 2 )
shapeArea( square ) # => 4
これは「ルビー・ウェイ」を実施していますか?そうでない場合、どのようにこれを実装しているのでしょうか?
解決
ルビーについての美しい事は、あなただけの実装方法の契約を提供するために、継承を使用する必要はありませんです。代わりに、あなたはこれを行っている可能性ます:
class Square
def initialize(side)
@side = side
end
def area
@side * @side
end
end
class Circle
def initialize(radius)
@radius = radius
end
def area
@radius * @radius * 3.14159
end
end
shapeArea(Square.new(2))
shapeArea(Circle.new(5))
これはダックタイピングとして知られている機能です。 、あなたが行ってもいいです(Rubyの用語では、我々はtwodエリアに応答言うだろう)twodは面積法を持っている限ります。
他のヒント
最初の答えは、「ルビーの道」ですが、C ++(非常に型付けされた)(ダックタイピング)のルビーからの変化を感じているならば、あなたはそれがより多くの家のように感じることができます:
class TwoD < Shape
...
def area
# make this truly look pure-virtual
raise NoMethodError, "Pure virtual function called"
end
end
もちろんあなたはとてもあなたも自分の繰り返しを避けることができルビーに移行しています
class Module
def pure_virtual(*syms)
syms.each do |s|
define_method(s) { raise NoMethodError, "Pure virtual function called: #{s}" }
end
end
end
class TwoD < Shape
pure_virtual :area
...
end
所属していません StackOverflow