1

だから、ここにもっとJava-esqのアプローチがあります(私は思う)...私はRubyでこのコードを持っています

class Human
  def move
    p 'Human move: X'
  end
end


class Computer
  def move
    p'Computer move: O'
  end
end

class Player
  def initialize(letter)
    if letter == 'X'
      return Human.new
    else
      return Computer.new
    end
  end
end

bob = Player.new('X')
bob.move

cli 'Human move: X' に戻ることを期待していますが、次のエラーが表示されます...

undefined method `move' for #<Player:0x007f8d930895a8> (NoMethodError)

誰もこのRuby初心者を助けることができますか?

- - - - - - - - - - - - -討論 - - - - - - - - - - - -

今、私は継承とオーバーライドを使用して、より「古典的な」Ruby のやり方でこれを行う方法を考え出しました。さて、これは私の心のサブプロセッサには意味がありません.つまり、このようにすると...他のクラスファイルでクラスファイルを要求し、新しいオブジェクトをインスタンス化することができました. Java で行う場合のように真にポリモーフィックであるとは感じません....コードは次のとおりです....

class Player
  def move
    return ""
  end
end

class Human < Player
  def move
    return 'Human move: X'
  end
end


class Computer < Player
  def move
    return'Computer move: O'
  end
end



players = [Human.new, Computer.new]
players.each {|player|
  print player.move
}
4

2 に答える 2

6

あなたはほとんどそれを作りました:) Rubyでは、コンストラクターから任意のオブジェクトを返すことはできません。できますが、その戻り値は無視されます。代わりに、ファクトリ メソッドを使用します(OOP で言えば)。

class Human
  def move
    p 'Human move: X'
  end
end


class Computer
  def move
    p 'Computer move: O'
  end
end

class Player
  def self.get_player(letter)
    if letter == 'X'
      return Human.new
    else
      return Computer.new
    end
  end
end

bob = Player.get_player('X')
bob.move
# >> "Human move: X"
于 2012-11-02T18:46:47.913 に答える
1

を呼び出しPlayer.newているためPlayer、関数で何を返すかに関係なく、オブジェクトが返されinitializeます。Human何らかの理由でComputer直接インスタンス化したくない場合は 、次のようにします。

class Player
  def self.new_player(letter)
    if letter == 'X'
      return Human.new
    else
      return Computer.new
    end
  end
end

bob = Player.new_player('X')
bob.move #Prints your output
于 2012-11-02T18:46:25.167 に答える