2016-02-24 3 views
2

Я строю шахматную игру. Я пытаюсь сгенерировать каждую шахматную фигуру с помощью Комбинирующей закрывающей площади, и хотя я могу вручную вводить ее в каждый класс, я бы хотел сделать это через наследование. Я не могу избежать вызова super дважды в подкласс. Буду признателен за любую помощь.Наследование класса Ruby и как избежать вызова супер дважды

Код:

class Piece 
    attr_accessor :color, :piece 

    def initialize(color) 
    @color = color 
    @piece = "#{@piece}\u20DE" 
    end 
end 

class King < Piece 
    def initialize(color) 
    super 
    @piece = "♔" if @color == "white" 
    @piece = "♚" if @color == "black" 
    super 
    end 
end 
+0

Что 'Объединение вмещающих Square'? – sawa

+0

Это символ Юникода. –

+0

Я собираюсь немного не по теме, но это кажется мне немного смешным: '@piece =" # {@ piece} \ u20DE ". Похоже, что 'Piece' является суперклассом, и вы инициализируете' @ piece', используя '@ piece' + некоторый unicode. Но '@ piece' не определен до этой строки, так что не всегда ли это будет unicode' \ u20DE'? –

ответ

2

Лично я бы переместить эту логику из конструктора целиком:

class Piece 
    attr_reader :color 

    def initialize(color) 
    @color = color 
    end 

    def piece 
    @piece ||= "#{base_piece}\u20DE" 
    end 
    alias :to_s :piece 

    private 
    def base_piece 
    self.class.const_get(color.upcase) 
    end 
end 

class King < Piece 
    WHITE = "♔" 
    BLACK = "♚" 
end 

puts King.new(:black), King.new(:white) 
# => ♚⃞ 
# ♔⃞ 
2

Я бы определить сеттер. В любом случае, он чище.

class Piece 
    attr_accessor :color, :piece 

    def initialize(color) 
    @color = color 
    @piece = "#{@piece}\u20DE" 
    end 
    def piece=(piece) 
    @piece = "#{piece}\u20DE" 
    end 
end 

class King < Piece 
    def initialize(color) 
    super 
    self.piece = "♔" if @color == "white" 
    self.piece = "♚" if @color == "black" 
    end 
end 

k = King.new('white') 
puts k.piece 
w = King.new('black') 
puts w.piece 

Результат:

$ ruby chess.rb 
♔⃞ 
♚⃞ 

Еще две вещи:

  • Имея класс Кусок с атрибутом @piece сбивает с толку.
  • Используйте attr_reader, если вы не собираетесь изменять @piece. (Я бы сказал, что продвижение пешки - это новый кусок, а не пешка, превращающаяся в королеву).
  • Пропустите установщик, просто определите to_s, который добавляет семантическое значение.
+0

Вы определяете 'set =' setter, но вы никогда не используете его. Вы хотите сделать 'self.piece = ...' вместо '@piece = ...'? Последнее устанавливает переменную экземпляра напрямую и не вызывает средство setter. –

+0

@ Jordan Действительно, thx. Теперь исправлено. –

Смежные вопросы