2013-04-05 76 views
0
的方法同名

是否有可能做這樣的事情:紅寶石 - 有沒有辦法來調用父類的方法重載的

class A 
    def a(var) 
    puts "do something with #{var}" 
    end 
end 

class B < A 
    def a(var) 
    var = var + "some modification" 
    #this is what I want to do: 
    super.a(var) 
    end 
end 

謝謝!

+0

在您的例子爲B類不是A和對象的子類不具有梅索德a,你想做什麼? – hotfix 2013-04-05 22:14:30

+0

好的錯字...修正:) – mfcabrera 2013-04-05 22:15:50

+0

http://stackoverflow.com/questions/3689736/rails-3-alias-method-chain-still-used可能與 – rogerdpack 2013-04-05 22:16:18

回答

4

除非我誤讀了您的問題,否則您應該可以自行撥打super;例如:

class A 
    def a(var) 
    puts "do something with #{var}" 
    end 
end 

class B < A 
    def a(var) 
    var = var + "some modification" 
    #this is what I want to do: 
    #super.a(var) 
    super 
    end 
end 

v = B.new 
v.a("hey") 

產生

$ ruby test.rb 
do something with heysome modification 
+2

有關如果你像這樣調用'super',將它的參數傳遞給父函數(通常是你想要的)。你也可以調用'super()'(空的參數列表)來調用沒有參數的父函數,或者使用'super(「無論」)「來顯式調用父類方法。 – 2013-04-05 22:22:25

2

如果你使用它自己的super然後它會調用super類的實現通過沿着你不能與super呼叫

使用方法名相同論點

class A 
    def a(var) 
    puts var 
    end 
end 

class B < A 
    def a(var) 
    super 
    end 
end 

B.new.a(1) #=> 1 

如果要修改的變量,那麼你可以重新分配var Arg或使用super調用傳遞參數

class A 
    def a(var) 
    puts var 
    end 
end 

class B < A 
    def a(var) 
    var = 2 
    super 
    end 
end 

B.new.a(1) #=> 2 

class A 
    def a(var) 
    puts var 
    end 
end 

class B < A 
    def a(var) 
    super(2) 
    end 
end 

B.new.a(1) #=> 2 
0

嘗試以下:

class A 
    def a(var) 
    puts "do something with #{var}" 
    end 
end 

class B < A 
    def a(var) 
    var = var + "some modification" 
    #this is what I want to do: 
    #super.a(var) 
    self.class.superclass.instance_method(:a).bind(self).call 12 
    end 
end 

v = B.new 
v.a("hello") 

輸出:

do something with 12 
另一個

之一:

class A 
    def a(var) 
    puts "do something with #{var}" 
    end 
end 

class B < A 
    alias :old_a :a 
    def a(var) 
    var = var + "some modification" 
    #this is what I want to do: 
    #super.a(var) 
    old_a 12 
    end 
end 

v = B.new 
v.a("hello") 

輸出:

do something with 12 
+0

我認爲這是以一種過於複雜的方式解決問題 - 請參閱其他答案 – 2013-04-05 23:21:01

+0

@ Paul.s'alias'是複雜的方式? Bummer我剛剛向OP展示了我們可以做多少種方式。 – 2013-04-05 23:30:29

+0

但是,爲什麼在構建語言時要經過額外的努力和複雜性?如果OP不知道那麼好的核心語言,那麼元編程就完全無法實現。 – 2013-04-05 23:39:18