继承初始化参数

时间:2015-05-29 01:17:22

标签: ruby inheritance initialization subclass super

我想知道如何正确初始化子类"计算机。"我希望它继承Game类中初始化的属性,除了#start,这是一个方法。在这种情况下,我也不确定如何处理initialize方法中的参数。有谁知道一种优雅的方式来改写它?感谢。

class Game
    attr_reader :input, :clues

    def initialize
        colors = %w(R O Y G I V)
        code = []
        all = ''
        count = 0
        start
    end

    def start
        ...
    end

    def ask_input
        ...
    end

class Computer < Game
    attr_reader :input, :clues
    def initialize
        colors = %w(R O Y G I V)
        code = []
        all = ''
        count = 0
        ask_input
        computer_turn
    end
 .....
 end

3 个答案:

答案 0 :(得分:1)

  

我希望它继承Game类中的初始化属性,除了#start,这是一个方法。

将继承所有属性和方法。你这样做是正确的:

class Computer < Game

您不需要attr_reader,因为它是从Game继承的。

  

在这种情况下,我也不确定如何处理initialize方法中的参数。

您可以执行以下操作。它以输入为参数。考虑:

computer = Computer.new( :foo )

计算机初始化后,input等于:foo

class Computer < Game
  def initialize input
    @input = input
    ...

请参阅:

computer.input
=> :foo

答案 1 :(得分:1)

  

我也不确定在这种情况下如何处理initialize方法中的参数

你只是

  • 在子类的super中添加initializer以调用其超类的initializer
  • 当然,所有实例变量在开始时都应该有@个字符,以使它们可用于所有实例menthod。
  • 同时从attr_reader类中移除Computer,因为它将从Game类继承
  

我希望它继承Game类中初始化的属性,除了#start,这是一个方法

  • 最后,为了避免调用#start类的方法Game,我认为您只需要在Computer
  • 中覆盖它

结果代码

    class Game
      attr_reader :input, :clues

      def initialize
        @colors = %w(R O Y G I V)
        @code = []
        @all = ''
        @count = 0
        start
      end

      def ask_input
        # sample value for @input 
        @input = 'sample input'
      end

      def start
        puts "start"
      end
    end

    class Computer < Game
      #attr_reader :input, :clues

      def initialize
        super
        ask_input
        computer_turn
      end

      def start
        # Do nothing
      end

      def computer_turn
        puts "computer_turn"
        p @colors
      end
    end


    comp = Computer.new
    # The string "start" is not puts here because Game#start is not called
    => computer_turn
    => ["R", "O", "Y", "G", "I", "V"]

    comp.input
    => "sample input"

答案 2 :(得分:0)

由于您不想要方法start,只需将其从Game类中删除,以便它不会出现在您的子类中。类似的东西:

class Game
    attr_reader :input, :clues

    def initialize
        colors = %w(R O Y G I V)
        code = []
        all = ''
        count = 0
        (Insert what start does here)
    end


    def ask_input
        ... 
    end

然后,只需使用:

覆盖Computer子类的初始化
def initialize
    colors = %w(R O Y G I V)
    code = []
    all = ''
    count = 0
    (insert other functionalities)
end

您还可以消除冗余attr_reader,因为它已从Game

继承而来