オーバーライドされたメソッドで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. は、スーパーメソッドを呼び出すのと同じデコレータパターンですか?
- 4. Oracle PL/SQLオブジェクトのスーパーメソッドを呼び出す方法
- 5. 派生クラスが強制的にスーパーメソッドを呼び出す方法
- 6. easymockを使ったMockingスーパーメソッド呼び出し
- 7. スーパーのみを呼び出すメソッドの目的は? Xcodeで
- 8. のUIViewController:[スーパーのinit] [自己initWithNibNameバンドル:]を呼び出す
- 9. 祖父母クラスのスーパーを呼び出していますか?
- 10. Swiftのモックからスーパーを呼び出す
- 11. カスタムビューにスーパー()を呼び出すとき、コンポーネントのコンストラクタは
- 12. ない方法[負荷] [スーパー・ロード]を呼び出す必要が
- 13. エイリアス化されたメソッドからスーパーを呼び出す
- 14. スーパー簡単なJavaScript関数の呼び出し
- 15. スウィフト - エクステンション&プロトコル - 「スーパー」関数が呼び出されない
- 16. スーパーのinitを呼び出すときのPythonの最大再帰深度エラー。
- 17. Emberコンポーネントライフサイクルフックメソッド - スーパーを呼び出すことは必須ですか?私のプロジェクトで
- 18. ES6クラスのスーパー(小道具)への呼び出しは重要ですか?
- 19. スーパーを呼び出さなければならないインターフェイス関数のアノテーション
- 20. 呼び出しスーパーは、私はこのコードを持っているクラス
- 21. インプレースイベント処理関数からスーパーメソッドを呼び出すことができないのはなぜですか?
- 22. スーパーメソッドのエラー
- 23. スーパーメソッドの使用
- 24. 呼び出すクラスのプロパティを呼び出す方法
- 25. スーパーのtoString()メソッドを呼び出しますが、現在のクラスの変数を使用して
- 26. twilio呼び出しを呼び出すためのカスタムボディパラメータ
- 27. アプリケーションのメソッド呼び出しを呼び出す
- 28. 別の関数呼び出しで関数を呼び出す
- 29. 1回の呼び出しでメソッドを呼び出す
- 30. SparkでUDFの呼び出しを呼び出す
...私はこの質問が実際には[They Might Be Giants](http://en.wikipedia.org/wiki/They_Might_Be_Giants)の曲だとは思えません。 。ごめんなさい。 –
だから、基本的にあなたは「スーパーデファー」の方法を望んでいますか? :) –