2017-08-30 6 views
0

method_2にA :: method_1を強制的に呼び出させるにはどうすればいいですか?Ruby:多態性を持たない現在のクラスのメソッドを呼び出す

class A 
    def method_1 
    puts "A" 
    end 

    def method_2 
    method_1 #call A::method_1 only if this is instance of A 
    end 
end 

class B < A 
    def method_1 
    puts "B" 
    end 
end 

B.new.method_2 

通常の実装では、method_1がオーバーライドされます。オーバーライドされたAのメソッドを呼び出す方法はありますか?

+0

なぜそれをしたいですか? – Stefan

+0

言語スコープの研究。 – MaxQwerty

+0

'method_1 if self.class == A'です。 – mudasobwa

答えて

1

それは一種の奇妙な質問ですが、あなたはまだあなたがこのコードで欲しい正確に何を実装することができます

class A 
    def method_1 
    puts "A" 
    end 

    def method_2 
    A.instance_method(:method_1).bind(self).call 
    end 
end 

class B < A 
    def method_1 
    puts "B" 
    end 
end 

puts B.new.method_2 
# => A 

あなたがBのインスタンスを持っているので、method_1が上書きされます。しかしA#method_1に直接A.instance_methodを指すことができます。

instance_methodUnboundMethodを返します。つまり、selfへの参照がありません。したがって、.bind(self)とバインドする必要があります。

次に、.callでメソッドを呼び出します。

+0

Rubyはかなり柔軟です。必要なものに応じて、 'method = b.method(:method_1)'や 'method = method.super_method while method.super_method'のようなもので最も基本的なメソッドを得ることができます。 – Kukunin

関連する問題