目次

オブジェクトなJavaScriptの基礎講座

オーバーライドと多重定義について

◆ はじめに

今回は、多態性(polymorphism)である、オーバーライドと多重定義に迫ります。

◆ オーバーライド

オーバーライドとは、クラスの継承をする場合に、子クラス(SubClass)内で親クラス(SuperClass)で定義されているメソッドを上書きしてしまうことを言います。もちろんこの時、親クラスが影響を受けることはありません。

具体的には、子クラス(SubClass)で親クラス(SuperClass)と同じ名前のメソッドを定義し直せば、オーバーライドになります。

サンプル

ソース
  <script type="text/javascript">
    function SuperClass()        // 親クラス
    {
      function SuperClass_myMethod()
      {
        document.write( "I am SuperClass Method.<BR>" );
      }
      SuperClass.prototype.myMethod = SuperClass_myMethod;  //親クラスのmyMethodメソッド
    }
    
    function SubClass()        // 子クラス
    {
      function SubClass_myMethod()
      {
          document.write( "I am SubClass Method.<BR>" );
      }
      SubClass.prototype.myMethod = SubClass_myMethod;   //子クラスのmyMethodメソッド
    }                                                    //親のmyMethodメソッドがオーバーライドされる
    SubClass.prototype = new SuperClass(); // 親クラス継承

    var oSuper = new SuperClass();
    var oSub   = new SubClass();
    
    oSuper.myMethod();
    oSub.myMethod();

 </script>

実行結果
注意

なぜか、NN4.75では、オーバーライドになりません...。とりあえず、IE6とNN6.1は大丈夫です。

◆ 多重定義

関数の多重定義とは、同じ名前の関数で、引数のインターフェースが異なる関数を複数定義することです。もちろん、実行時は、それぞれの処理をこなします。

C++やJavaでは、おなじみの関数の多重定義ですが、実は、JavaScriptでは関数の多重定義はできません。

しかし、JavaScriptの便利な機能を利用すると同等のことがもっと汎用的に実現できます。

JavaScriptの便利な機能

サンプル

function sum(){
	return 0;
}

// number x
function sum( x ){
	return ++x;
}

// number x , number y
function sum( x , y ){
	return x+y;
}

// number配列のarray
function sum( array ){
	var s = 0 ;
	for(var i=0;i<array.length;i++) s += array[i];
	return s;
}

上記は、JavaScriptでは、最後に定義したsumが有効にになり、他は、無視されます。(最後に定義したsumに上書き...)

しかし、便利な機能を利用すると以下のように多重定義と同等のこの機能実装できます。

function sum(){ // 引数は、書いても書かなくても良い。
                // 関数の引数を保持するオブジェクト arguments
                // 例えば、引数が1個のときその値は arguments[0] で参照できる。
                // 引数の個数(arguments.length )により処理を分岐する
    switch( arguments.length ){
        case 0 : default : return 0;    // 引数の個数が0、又はどれにも当てはまらないとき
        case 1 : {                      // 引数の個数が1のとき
            if( arguments[0].constructor == Array ){
                var s = 0;
                for(var i=0;i<arguments[0].length;i++) s += arguments[0][i];
                return s;
            }else{
                return ++arguments[0];
            }
        }
                                       // 引数の個数が2のとき
        case 2 : return arguments[0]+arguments[1];
    }
}

x1 = sum();
x2 = sum(4);
x3 = sum(4,6);
a = new Array(3);
a[0] = 1;
a[1] = 2;
a[2] = 3;
x4 = sum(a);
document.write( "x1 =" + x1 + "<br>");
document.write( "x2 =" + x2 + "<br>");
document.write( "x3 =" + x3 + "<br>");
document.write( "x4 =" + x4 + "<br>");

実行結果

目次