JavaScriptの多重継承とオーバライド - JavaScriptの個人的なメモ (その2)

JavaScriptで多重継承

前回のメモでは、JavaScriptにおける多重継承のやり方を書いておきました。これを見て、メソッドのオーバライドのやり方が気になった人もいるかもしれません。

前回のメモ - JavaScrpitの個人的なメモ

http://d.hatena.ne.jp/dhrname/20121002
そこで、今回は、前回に続けて、メソッドのオーバライドのやり方を説明します。
前回と同様に、JavaScript以外の言語を習得している人を念頭においています。

メソッドのオーバライド

まず、Super1とSuper2の2つのコンストラクタ関数を用意します。
それらをChild関数に継承させます。このChild関数には、親と同じ名前のメソッドが登録されています。このメソッドに親のメソッドをオーバライドさせてみましょう。さらに親のメソッドも呼び出します。これはクロージャを使えば、かんたんに実現できます。

   var Super1 = function(){
            var that = this,
                a; /*プライベート変数として使う*/

            that.setA = function(n) {
                          a = n;
            };
            that.getA = function() {
                          return a;
            };
            that.hoge = function() {
                          return that.getA();
            };
  },
  Super2 = function(){
            var that = this,
                b;
            that.hoge = function(){
                          b = 20;
            };
            that.getB = function() {
                          return b;
            };
  },
  Child = function() {
            var that = this,
                superHoge, superHoge2; /*親メソッドにアクセスするためのプライベート変数*/
            /*多重継承を始める*/
      Super1.apply(that, arguments);
            superHoge = that.hoge;    /*このときはSuper1::hoge*/

      Super2.apply(that, arguments);
            superHoge2 = that.hoge;   /*このときはSuper2::hoge*/

            that.hoge = function() {
                       var a = superHoge(); /*Super1のhogeメソッドを呼び出す*/
                       superHoge2();        /*Super2のhogeメソッドを呼び出す*/
                       return ( a + that.getB()); 
            };
  };
  var obj = new Child();
  obj.setA(2);
  obj.hoge(); /*22を返す*/

ただし、あなたが親のメソッドを使う気がないのでしたら、以下のようにChild関数はもっと単純に書くことができます。

  Child = function() {
            var that = this;
            /*多重継承を始める*/
      Super1.apply(that, arguments);
      Super2.apply(that, arguments);

            that.hoge = function() {
                       return 12; 
            };
  };

  var obj = new Child();
  obj.setA(1);
  obj.hoge(); /*12を返す*/

結論

  1. JavaScriptでは、メソッドのオーバライドは、代入だけでOK
  2. メソッドが上書きされてしまうので、親のメソッド参照引渡しが必要となります (だから、that = thisで回避)

続き

thisの遅延束縛 - JavaScriptの個人的なメモ (その3)

http://d.hatena.ne.jp/dhrname/20121026