2015-10-26 41 views
2

不知道這是否可以用Ruby,但我想用一些子類共享的幾個方法編寫一個類。這個超類將包含我希望子類繼承的類和實例方法。假設我將永遠不會直接使用超類,我只用它來抽象出重複的方法(思考DRY)。這涉及具有將從子類更改爲子類的常量(API URI)。Ruby類 - 類方法中的引用子類

這裏是什麼,我試圖做一個例子:

class Foo 
    attr_accessor :param 
    def initialize(param) 
    @param = param 
    end 
    def self.get 
    <SubClass>.new(self::MY_CONSTANT) 
    end 
end 

class Bar < Foo 
    MY_CONSTANT = 'Woot' 
end 

class Baz < Foo 
    MY_CONSTANT = 'Pew Pew' 
end 

我想要的行爲是這樣的:

Bar.get 
puts Bar.param # => Woot 
Baz.get 
puts baz.param # => Pew Pew 

這可能嗎?我是否完全錯誤地接近了這一點?

更新

每@Nathan,self.newself.get方法奏效了這裏。

[39] pry(main)> test = Bar.get 
=> #<Bar:0x000001072ecc20 @param="Woot"> 
[40] pry(main)> test.param 
=> "Woot" 
[41] pry(main)> test 
=> #<Bar:0x000001072ecc20 @param="Woot"> 
[42] pry(main)> test.class 
=> Bar 
[43] pry(main)> test2 = Baz.get 
=> #<Baz:0x000001071b5528 @param="Pew Pew"> 
[44] pry(main)> test2.class 
=> Baz 
[45] pry(main)> test2.param 
=> "Pew Pew" 
+1

你可能會發現它有助於你的代碼'puts'語句賦予你'self'的價值。例如,'class Klass; def my_method;把自己放在#{__ method__} =#{self}「;結束;結束; Klass.new.my_method#=> self in my_method =#'。 –

回答

3

使用self

裏面Foo.getself是你打電話get的類,這將是BarBaz當你分別執行Bar.getBaz.get

因此,如果您有<SubClass>,只需放入self,並且所有內容都按照您的預期工作。

def self.get 
    self.new(self::MY_CONSTANT) 
end 

您也可以省略self,因爲這是Ruby在沒有明確指定對象時自動使用的。

def self.get 
    new(self::MY_CONSTANT) 
end 

而且,在你的代碼,你正在測試的值,我覺得打算這是什麼:

bar = Bar.get 
puts bar.param # => Woot 
baz = Baz.get 
puts baz.param # => Pew Pew 

最後對於這是否是最好的方式,這是意見 - 但對於我來說,當你試圖將該值作爲常量提供給initialize時,似乎很奇怪。換句話說,如果您有需要使用API​​ URI的方法,只需直接引用常量,而不是使用@param初始化實例本身。你可以參考像這樣的實例方法中的常量:self.class::MY_CONSTANT

+0

太棒了,謝謝!出於某種原因,我認爲'self'會引用當前的'Bar'或'Baz'的實例,因此它會試圖針對現有的實例調用.new。感謝您的快速回答! – geezyx

+0

哦!至於你最後的評論,謝謝你的建議。在我真正的代碼中,我直接在rest-client調用中使用常量,而不是將它分配給實例變量。看起來像一個快速的方式來顯示所需的行爲,但它不完整。接得好! – geezyx