質問

は、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top