루비

2012-11-02 4 views
1
에서 다형성을 수행하는 방법에

그래서 여기에 더 자바 변호사의 접근 방식은 (내 생각) ... 내가 다시 CLI '인간의 이동에 얻을 것으로 기대하고 있습니다루비

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 

루비에서이 코드를 가지고있다 : X ' 나는 다음과 같은 ...

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

아무도 도와 드릴까요이 루비 멍청한 놈의 오류를 받고 있어요?

------------------------- 토론 -------------------- ----

이제는 상속과 오버라이드를 사용하는 '고전적인'루비 패션에 대해 더 자세히 살펴 보았습니다. 자, 내 생각에 서브 프로세서에 아무런 의미가 없습니다. 나는이 방법으로하면 ... 다른 클래스 파일에 클래스 파일을 요구하고 새로운 객체를 인스턴스화 할 수 있습니다. 당신이 다시 Player 개체를 얻을 것이다, 그래서 그것은 .... 당신은 Player.new 전화하는거야

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

당신은 거의 그것을 만든 : 루비에서 당신은 생성자에서 임의의 객체를 반환 할 수 없습니다. 음, 할 수는 있지만 반환 값은 무시됩니다. 대신 Factory Method을 사용하십시오 (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" 
+0

'Player.new'를 재정의 할 수 없습니까? 나는 그 일을 한 번 믿지 만, 나는 돌아가서 그것을 찾아야 할 것입니다. –

+1

@phoffer : 그래, 나는 그가 할 수 있다고 생각하지만,해서는 안된다. –

+0

예, 가능합니다. 저는 혼자서 그것을했습니다. 너와 같지만'self.get_player'를'self.new'로 바꾸고 마지막 줄에서 두번째 줄로 바꾼다. 왜 그것이 나쁜 습관이라고 설명해 주시겠습니까? –

1

을 여기에 코드입니다 .... 자바에서 할 것이가하는 진정한 다형성 방법을 느끼지 않는다 initialize 함수에서 반환하는 것에 관계없이 어떤 이유로 당신이 직접 HumanComputer를 인스턴스화하지 않으려면, 그런 식으로 뭔가를 할 :

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