オーバーライドされたメソッドでsuper.super
のようなことができますか?つまり、直接親のスーパーをバイパスし、 "祖父母"のスーパーと呼ぶのですか?スーパーのスーパーメソッドを呼び出す
答えて
これはお勧めしますが、何をたいことは、このようなことができありません。
grandparent = self.class.superclass.superclass
meth = grandparent.instance_method(:the_method)
meth.bind(self).call
これは最初の祖父母のバージョンを表すUnboundMethod
を得るためにそれにinstance_method
を呼び出し、その後、祖父母のクラスを取得することにより動作しますthe_method
。次に、UnboundMethod#bind
とMethod#call
を使用して、現在のオブジェクトで祖父母のメソッドを呼び出します。
これがOOP(カプセル化)の原則の1つを破っていることを考えれば、私は心からそれができないことを願っています。これをやろうとした場合でも、あなたのデザインに問題があると言えます。
本当に、私はすべてがRubyで可能なように思っていただけに興味がありました。 – Vincent
申し訳ありませんが、相続ダイヤモンドについて聞いたことがありますか?これがRubyで解決できる方法です。だから、継承のダイヤモンドを作ってはいけません。それとも、Rubyを変えてみましょう。私は議論しません。あなたが言うことは、理想的な世界に定着するかもしれません。しかし現実の世界では、悪いプログラマによって書かれたコードを使って作業しています。コードを修正する権利を持たずに接続する必要があります。そして、これはこれらのドライバーのためのものです。 –
あなたは、ある種のオプションの「親に渡す」パラメータを許可するようにメソッドの引数を変更することができます。あなたの子のスーパークラスでこのパラメータをチェックし、もしそうなら、そのメソッドからsuperを呼び出して、それ以外の場合は実行を続行します。
class Grandparent; def method_name(opts={}); puts "Grandparent called."; end; end
class Parent < Grandparent
def method_name(opts={})
return super if opts[:grandparent]
# do stuff otherwise...
puts "Parent called."
end
end
class Child < Parent
def method_name(opts={})
super(:grandparent=>true)
end
end
ruby-1.9.2-p0 > Child.new.method_name
Grandparent called.
=> nil
そうでなければ、私は@Femarefに同意します。何かが可能なのは、それが良い考えであるとは限りません。必要と思われる場合は、デザインを再検討してください。
- 1. Rubyミックスとスーパーメソッドを呼び出す
- 2. は、スーパーメソッドを呼び出すのと同じデコレータパターンですか?
- 3. Oracle PL/SQLオブジェクトのスーパーメソッドを呼び出す方法
- 4. 派生クラスが強制的にスーパーメソッドを呼び出す方法
- 5. スーパーのみを呼び出すメソッドの目的は? Xcodeで
- 6. のUIViewController:[スーパーのinit] [自己initWithNibNameバンドル:]を呼び出す
- 7. 祖父母クラスのスーパーを呼び出していますか?
- 8. ない方法[負荷] [スーパー・ロード]を呼び出す必要が
- 9. エイリアス化されたメソッドからスーパーを呼び出す
- 10. スーパーのinitを呼び出すときのPythonの最大再帰深度エラー。
- 11. ES6クラスのスーパー(小道具)への呼び出しは重要ですか?
- 12. インプレースイベント処理関数からスーパーメソッドを呼び出すことができないのはなぜですか?
- 13. 一方向のajax呼び出しを呼び出す
- 14. メソッドの呼び出しを呼び出すC#
- 15. Android :: Broadcasr Receiverクラスを呼び出すメソッドの呼び出し?
- 16. アプリケーションのメソッド呼び出しを呼び出す
- 17. IMethodのメソッド呼び出しを呼び出すCallHierarchy
- 18. ビューの呼び出し後に関数を呼び出す
- 19. UITextViewを呼び出す方法addTargetメソッドを呼び出す
- 20. データベース接続を呼び出すクラスを呼び出す
- 21. のJava:スーパーを呼び出す方法()super()をオーバーライドされたメソッドに(祖父母法)
- 22. SetEventを呼び出した後にCloseHandleを呼び出す
- 23. main()を呼び出して関数を呼び出す
- 24. すべてのdef呼び出しのRuby呼び出しメソッド?
- 25. defrecordコンストラクタで呼び出しを呼び出しますか?
- 26. ToList()メソッド呼び出し時にデータベースを呼び出す
- 27. jQueryで.NET WSDL呼び出しを呼び出す方法Javascript?
- 28. メソッドの呼び出し元をトラッキングする[呼び出しによって呼び出された]
- 29. テストコントローラ(MessageSourceを呼び出すサービスを呼び出す)でのMessageSourceのインスタンス
- 30. vbのリンクボタンを呼び出す(ユーザコントロール内で)JavaScriptのClickイベントを呼び出す
...私はこの質問が実際には[They Might Be Giants](http://en.wikipedia.org/wiki/They_Might_Be_Giants)の曲だとは思えません。 。ごめんなさい。 –
だから、基本的にあなたは「スーパーデファー」の方法を望んでいますか? :) –