【TypeScript】super()の使い方理解する。(親Classのメソッドを使用、値を渡す)

# 【TypeScript】super()の使い方理解する。(親Classのメソッドを使用、値を渡す)

2017年3/20日に追記
[【TypeScript】__extendsが何をやっているか](http://kenjimorita.jp/typescript__extends_new__/)
こちらで説明しています。

superの使い方。理解が不足していたので改めてミニマムで動く奴を作ってみました。

**super キーワード**

- 親クラスのコンストラクタを呼ぶ際に使う。
- 子クラスから親クラスの「public」なメソッドにアクセスすることができる。


## 親のメソッドを使用する
こちらは子クラスから親クラスのメソッドを呼んでいます
[実際のコード](http://www.typescriptlang.org/Playground#src=module%20A%7B%0Aexport%20interface%20IfaceA%20%7B%0A%09name%3A%20string%3B%0A%7D%0Aexport%20interface%20IfaceB%7B%0A%09name%3Astring%3B%0A%09num%3Anumber%3B%0A%7D%0A%0Aexport%20class%20Kenji%20implements%20IfaceB%7B%0A%09constructor(public%20name%3F%3Astring%2C%20public%20num%3F%3Anumber)%7B%0A%09%7D%0A%09get()%7B%0A%09%09return%20'eeee'%3B%0A%09%7D%0A%09%7D%0Aexport%20class%20Kenji2%20extends%20Kenji%7B%0A%09constructor(public%20name%3F%3Astring%2Cpublic%20num%3F%3Anumber)%7B%0A%09%09super()%3B%0A%09%7D%0A%09get2()%7B%0A%09%09return%20super.get()%0A%09%7D%0A%7D%0A%7D%0Avar%20ll%20%3D%20new%20A.Kenji('fafa'%2C6)%0Avar%20lk%20%3D%20new%20A.Kenji2()%0Aalert(ll.get())%0Aalert(lk.get2()))

```ts:ts
module A{
export interface IfaceA {
	name: string;
}
export interface IfaceB{
	name:string;
	num:number;
}

export class Kenji implements IfaceB{
	constructor(public name?:string, public num?:number){
	}
	get(){
		return 'eeee';
	}
	}
export class Kenji2 extends Kenji{
	constructor(public name?:string,public num?:number){
		super();//ここで呼び出す
	}
	get2(){
		return super.get()//superへのアクセス
	}
}
}
var ll = new A.Kenji('fafa',6)
var lk = new A.Kenji2()
alert(ll.get())//eeee
alert(lk.get2())//eeee
```

compile後のJS

```js:js
var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var A;
(function (A) {
    var Kenji = (function () {
        function Kenji(name, num) {
            this.name = name;
            this.num = num;
        }
        Kenji.prototype.get = function () {
            return 'eeee';
        };
        return Kenji;
    })();
    A.Kenji = Kenji;
    var Kenji2 = (function (_super) {
        __extends(Kenji2, _super);
        function Kenji2(name, num) {
            _super.call(this);
            this.name = name;
            this.num = num;
        }
        Kenji2.prototype.get2 = function () {
            return _super.prototype.get.call(this);
        };
        return Kenji2;
    })(Kenji);
    A.Kenji2 = Kenji2;
})(A || (A = {}));
var ll = new A.Kenji('fafa', 6);
var lk = new A.Kenji2();
alert(ll.get());
alert(lk.get2());

```

ちょっと書き方で「あれなんだっけな」と思ったのは
子クラスのsuperをどこで使うかでした。
上記の通りconstructore内ですね。

子クラスのインスタンスメソッド(get2)内で呼び出しています。


## 親に必要な値をsuperを使って渡す

下記のようにあるプロパティとあるメソッドに分けたClassをそれぞれ継承してきて子供がsuperで必要な値を渡すこともできる。

[下記実際のコード](http://www.typescriptlang.org/Playground#src=class%20Person%20%7B%0A%09constructor(public%20name%3Astring)%7B%0A%09%09%0A%09%7D%0A%7D%0Aclass%20PersonFunc%20extends%20Person%7B%0A%09get()%7B%0A%09%09this.name%20%2B%20'%E3%81%A1%E3%82%83%E3%82%93!'%3B%2F%2F%E8%A6%AA%E3%81%AEname%E3%82%92%E5%8F%82%E7%85%A7%0A%09%09%2F%2Freturn%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%82%92%E5%AE%9A%E7%BE%A9%0A%09%7D%0A%7D%0A%0Aclass%20MoritaGetMajide%20extends%20PersonFunc%7B%0A%09constructor()%7B%0A%09%09%2F%2F%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%81%AB%E5%BC%95%E6%95%B0%E3%81%AF%E4%B8%8D%E8%A6%81%E3%80%81%E3%81%9F%E3%81%A0%E5%BF%85%E8%A6%81%E3%81%AA%E5%80%A4%E3%82%92%E8%A6%AA%E3%81%AB%E3%82%8F%E3%81%9F%E3%81%99%0A%09%09super('%E3%81%91%E3%82%93%E3%81%98')%2F%2F%E3%81%93%E3%82%8C%E5%BF%85%E8%A6%81%0A%09%7D%0A%7D%0Avar%20fafa%20%3D%20new%20MoritaGetMajide()%3B%0Afafa.get()%2F%2F%E3%81%91%E3%82%93%E3%81%98%E3%81%A1%E3%82%83%E3%82%93%0A)

```ts:ts
class Person {
	constructor(public name:string){
	}
}
class PersonFunc extends Person{
	get(){
		alert(this.name + 'ちゃん!');//親のnameを参照
		//returnするものを定義
	}
}

class MoritaGetMajide extends PersonFunc{
	constructor(){
		//コンストラクタに引数は不要、ただ必要な値を親にわたす
		super('けんじ')//これ必要
	}
}
var fafa = new MoritaGetMajide();
fafa.get()//けんじちゃん
```

```js:js
var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var Person = (function () {
    function Person(name) {
        this.name = name;
    }
    return Person;
})();
var PersonFunc = (function (_super) {
    __extends(PersonFunc, _super);
    function PersonFunc() {
        _super.apply(this, arguments);
    }
    PersonFunc.prototype.get = function () {
        alert(this.name + 'ちゃん!'); //親のnameを参照
        //returnするものを定義
    };
    return PersonFunc;
})(Person);
var MoritaGetMajide = (function (_super) {
    __extends(MoritaGetMajide, _super);
    function MoritaGetMajide() {
        //コンストラクタに引数は不要、ただ必要な値を親にわたす
        _super.call(this, 'けんじ'); //これ必要
    }
    return MoritaGetMajide;
})(PersonFunc);
var fafa = new MoritaGetMajide();
fafa.get(); //けんじちゃん
```

いかがでしたか？
お腹すきましたか？？



参照書籍
[TypeScriptリファレンス Ver.1.0対応](http://www.amazon.co.jp/TypeScript%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-Ver-1-0%E5%AF%BE%E5%BF%9C-%E3%82%8F%E3%81%8B%E3%82%81-%E3%81%BE%E3%81%95%E3%81%B2%E3%82%8D/dp/484433588X)
[大規模開発でも小規模開発でも使える TypeScript実践入門](http://www.amazon.co.jp/s/ref=nb_sb_ss_i_3_10?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Dstripbooks&field-keywords=typescript+%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&sprefix=TypeScript%2Cstripbooks%2C293)