-1

私は次のクラスを持っています:

class A
  @@one = {1 => "hen", 2 =>  "di", 3 =>  "tri", 4 =>  "tetra"}
  @@two = {5 =>  "penta", 6 =>  "hexa", 7 =>  "hepta", 
          8 =>  "octa", 9 =>  "nona"}

  def initialize(value)
    @value = value
  end

  def to_s
    value = @value
    if value <=4
      @@one[value]
    else
      @@two[value]
    end
  end
end

class B < A
  @@one = {1 => "meth", 2 =>  "eth", 3 =>  "prop", 4 =>  "but"}

  def initialize(value)
    @value = value
  end
end

および次のドライバー:

require_relative 'A.rb'
require_relative 'B.rb'

puts A.new(1)
puts B.new(1)

出力を次のようにしたいと思います。

hen
meth

しかし、A クラス変数 @@one は B クラス変数 @@one によって上書きされます。だから私の出力はこれです:

meth
meth

クラスインスタンス変数、クラス定数、クラス変数を試してみました。しかし、どちらのソリューションも機能しません。

4

2 に答える 2

1

これを試してください(「クラスインスタンス変数、クラス定数、およびクラス変数を試しましたが、どちらのソリューションも機能しません」と言ったため)、この特定のケースに最適なクラス定数を使用してソリューションを提供しています:

class A
 ONE = {1 => "hen", 2 =>  "di", 3 =>  "tri", 4 =>  "tetra"}
 TWO = {5 =>  "penta", 6 =>  "hexa", 7 =>  "hepta", 
      8 =>  "octa", 9 =>  "nona"}

def initialize(value)
  @value = value
end

def to_s
 value = @value
  if value <=4
   self.class::ONE[value]
  else
   self.class::TWO[value]
end
end

終わり

class B < A
 ONE = {1 => "meth", 2 =>  "eth", 3 =>  "prop", 4 =>  "but"}

 def initialize(value)
  @value = value
 end
end

説明: このような場合、子のケースは親クラスのものをオーバーライドするため、(子クラスによってオーバーライドされる) 親クラスの何かを使用する場合は、class_name:: ("::" 演算子) で明示的に言う必要があります。

于 2013-08-04T01:55:21.430 に答える