2012-09-18 102 views
2

我正在用rails編寫一個程序,其中一個類與另一個類具有相同的行爲。唯一的區別是有一個類變量,@secret_num,這兩個類之間的計算方式不同。我想調用特定的超類方法,但使用子類中的類變量。棘手的是,類變量不是一個常量,所以我將它設置在自己的方法中。有什麼辦法可以做到我在下面試圖做的事情? 感謝父類的Ruby調用子方法

Class Foo 
    def secret 
    return [1,2,3].sample 
    end 

    def b 
    @secret_num = secret 
    ... # lots of lines of code that use @secret_num 
    end 
end 

Class Bar < Foo 
    def secret 
    return [4, 5, 6].sample 
    end 

    def b 
    super # use @secret_num from class Bar. 
    end 
end  

這不起作用,因爲調用super也稱爲父類的方法secret,即Foo#secret,但我需要使用的祕密號碼從子類,即Bar#secret

+0

它是否必須是類變量?怎麼樣一個屬性? – waldrumpus

+0

FWIW,正如所選的答案所示,您不需要在方法聲明中使用顯式的return語句。 Ruby將自動返回方法中的最後一條語句。 –

回答

3
class Foo 
    def secret 
    [1,2,3].sample 
    end 

    def b(secret_num = secret) 
    <lots of lines of code that use secret_num> 
    end 
end 

class Bar < Foo 
    def secret 
    [4, 5, 6].sample 
    end 
end  

注意,你並不需要通過secret作爲參數傳遞給b。只要您不在子類中重新定義b,繼承將負責調用secret的正確實現。

我的首選是將它作爲參數,以便我可以在測試中傳遞各種值。