2010-12-30 8 views
1

は、今私が持っている:私はCの@yは、まだ「FOO」に等しく設定されるインスタンス化したときにRubyのデザインパターンの質問 - クラスは/モジュール継承

module A 
    class B 
    def initialize 
     @y = 'foo' 
    end 
    end 
end 

module A 
    class C < B 
    def initialize 
     @z = 'buzz' 
    end 
    end 
end 

は、どのように私はそれを持つことができますか?私はCで初期化を繰り返す必要がありますか?私は次の悪いパターンですか? @yはクラス変数か、モジュールの下の定数であるべきですか?どんな助けもありがとう!

答えて

2

キーワードsuperが必要です。それは同じメソッドの親の定義を呼び出します。

場合によってはパラメータを追加しました。 注:B#initializeを渡すには、オプションのパラメータも使用する必要があります。

module A 
    class C < B 
    def initialize(params = nil) 
     super(params) # calls B#initialize passing params 
     @z = 'buzz' 
    end 
    end 
end 
+3

引数リストのない 'super'は、元々の引数をそのまま渡すので、' super(params) 'の代わりに' super'と言うことができます。 –

+0

+1私はいつもそれを忘れています。私は編集的です。参照の引用のための – EnabrenTane

3
class A::C < B 
    def initialize(x, y) 
    super # With no parens or arguments, this passes along whatever arguments 
      # were passed to this initialize; your initialize signature must 
      # therefore match that of the parent class 
    @z = 'buzz' 
    end 
end 

あるいは、@EnabrenTaneが指摘したように、あなたは明示的にスーパークラスが期待されます知っているものは何でも引数に沿って渡すことができます。

継承の詳細については、Pickaxeの本の旧版オンライン版のInheritance and Messagesに関するセクションを参照してください。

+0

+1。 – EnabrenTane