1

次のように始まるクラスがあります。

class Hedgehogs
  attr_accessor :name, :age, :color, :weight, :fur_quality, :disposition, :sexual_aggression, :has_syphilis # ... etc etc.

initializeclass の新しいインスタンスごとに大きく異なる 、 method によって定義される属性の長いリストを使用します。

しかし、マダガスカルのハリネズミは常に茶色で、性的に攻撃的で、梅毒に免疫があることがわかったので、これらの属性は常に同じです.

効率のために新しいクラスを作成する必要があります。その場合、新しいクラスが ' プロパティをMadagascarHedgehogs継承することを確立するにはどうすればよいですか?Hedgehogsinitialize

4

3 に答える 3

1

これにはいくつかの方法があります。おそらくinitialize、サブクラスから呼び出してオーバーライドするフックメソッドを追加します。initialize特に非常に多くの変数があるため、の個々の引数の代わりにハッシュを使用することもお勧めします。

class Hedgehog
  def initialize(attributes = {})
    attributes.each do |key, value|
      instance_variable_set("@#{key}", value)
    end
    set_constant_attributes
  end

  def set_constant_attributes
  end
end

class MadagascarHedgehog
  def set_constant_attributes
    @default1 = 'default value 1'
  end
end

オーバーライドすることにより、フック メソッドなしでこれを行うこともできますinitialize

class MadagascarHedgehog
  def initialize(attributes = {})
    super(attributes)
    @default1 = 'default value 1'
  end
end

ただし、これは一般的に表現力が低いと思います。将来このコードを読んだり保守したりする人によっては、set_constant_attributes適切に信頼するよりも、「メソッドで定数属性を定義する」と言う方が簡単だと思います。初期化をオーバーライドします。

3 番目の方法は、リーダー メソッドをオーバーライドすることです。これはシンプルで簡潔です (考えてみると、おそらく私のお気に入りです)。

class MadagascarHedgehog
  def color
    'brown'
  end
end
于 2013-06-24T21:49:52.540 に答える
0

まず第一に、あなたのクラスは単数形、つまりHedgehogandであるべきだと思いますMadagascarHedgehog

メソッドを表示しないinitializeので、初期化する属性が非常に多いため、ハッシュを渡していると思います。

メインクラスが次のようになっているとします

class Hedgehog

  attr_accessor :name, :age, :color, :weight, :fur_quality, :disposition, :sexual_aggression, :has_syphilis

end

initialize次に、定数属性をデフォルト設定し、実際の初期化のために値をスーパークラスに渡すメソッドをサブクラスに記述できます。

必要に応じて、属性書き込みアクセサーを無効にして、それらの値が上書きされないようにすることもできますundef_method

class MadagascarHedgehog < Hedgehog

  def initialize(args)

    args[:color] = 'brown'
    args[:sexual_aggression] = 'aggressive'
    args[:has_syphilis] = 'immune'

    super(args)

  end

  undef_method :color=
  undef_method :sexual_aggression=
  undef_method :has_syphilis=

end
于 2013-06-24T21:53:23.427 に答える
0

マダガスカルのハリネズミを作る方法を作ることができます。

class Hedgehogs
  attr_accessor :name, :age, :color, :weight, :fur_quality, :disposition, :sexual_aggression, :has_syphilis

  def initialize(opts)
    @name = opts[:name] || 'Default Name'
    @age = opts[:age] || 'Default Age'
    ... etc ..
  end

  def self.madagascar_hedgehog
    self.new(:name => 'Madagascar', :age => 50)
  end
end
于 2013-06-24T21:40:16.167 に答える