2010-10-20 3 views
1

Предположим, у меня есть два класса, как так:вызова метода супер-класса с изюминкой

class Parent 
    def say 
    "I am a parent" 
    end 
end 

class Child < Parent 
    def say 
    "I am a child" 
    end 

    def super_say 
    #I want to call Parent.new#say method here 
    end 
end 

Какие варианты, чтобы сделать это? Я подумал:

def super_say 
    self.superclass.new.say #obviously the most straight forward way, but inefficient 
end 

def super_say 
m = self.superclass.instance_method(:say) 
m = m.bind(self) 
m.call 
#this works, but it's quite verbose, is it even idiomatic? 
end 

Я ищу способ, который не включает в себя сглаживанием Parent.new # сказать что-то еще, что сделало бы его уникальным в метод поиска цепи (Или это на самом деле предпочтительным способом ?). Любые предложения?

ответ

2

Я предпочитаю использовать псевдоним. (Я не совсем уверен, что я понимаю ваше возражение на него.)

Пример:

class Child < Parent 
    alias :super_say :say 

    def say 
    "I am a child" 
    end 
end 

Дает:

irb(main):020:0> c = Child.new 
=> #<Child:0x45be40c> 
irb(main):021:0> c.super_say 
=> "I am a parent" 
0

Ваше второе решение (bind()) - это то, за что я бы пошел. Это многословно, потому что то, что вы делаете, очень необычно, но если вам действительно нужно это сделать - это решение кажется мне прекрасным.

Смежные вопросы