2009-08-21 9 views
4

http://gist.github.com/172341に利用できない方法は、(stackoverflowのは、書式設定を破壊した)サブクラス

、人間によって作成された以下の場合メソッド名で少年に使用できません。 attr_accessorメソッドがサブクラスで利用可能な ではないという私の理解が正しいですか? attr_accessorで追加されたメソッドにアクセスするには、スーパークラスを使用する必要があります。

class Human 
    def self.age 
    @age = 50 
    end 
    def self.age=(input) 
    @age = input 
    end 

    cattr_accessor :name 

    self.name = 'human' 
end 
class Boy < Human 
end 

puts Human.age 
puts Boy.age 
puts Human.name 
puts Boy.superclass.name 
puts Boy.name # => 'human' 
+0

私はちょうどそれを自分自身を試してみました、それが働いた - 方法が少年に利用可能であった - 少年は名前が与えられていなかったので、もちろんBoy.nameがnilだったのに。男の子が自分の名前を持っているのではなく、人間の名前を継承してもらいたいという問題はありますか? – Chuck

+2

要点はもう入手できません。 – noumenon

答えて

1

は、この特定の問題を修正cattr_accessorです。 2つのオブジェクトは、1つのインスタンス変数を共有することはできません。彼らはどちらもメソッドを持っていますが、メソッドはオブジェクトの適切なivarにアクセスします。

+1

'cattr_accessor'は、これらのクラスのすべてのクラスとインスタンスをプロパティに同じ値で共有します。私はこれがまさに正しい行動であるとは思わない。 – Chuck

+0

どちらも同じ属性にアクセスするので意味があります。サブクラスに別の値を宣言したい場合は、cattr_accessorを再宣言する必要があります。 – tadman

+0

私はcattr_accessorを使ってこの問題を解決したと言わざるを得ないでしょう。しかし、私は本当にattr_accessorの動作を理解したかったのです。私は、インスタンス変数を格納することを理解しました。しかし、インスタント変数はサブクラスで使用できます。 実際の質問はBoy.nameがnilを返す理由です。 また、このサイトのコードブロックを私のmac/FFで使用できないのはなぜですか? – Roger

0

レールclass_attributeの方が良いでしょう。

Rails Guide