見出し画像

TypeScript 入門の記録(62)プロを目指す人のためのTypeScript入門(46)第5章TypeScriptのクラス(6)

 先週は、親クラスの機能のオーバーライドについて学習しました。子クラスが親クラスのコンストラクタをオーバーライドする場合、コンストラクタの中に super呼び出しを含める必要があるところまで学習したので、今日は、その理由の確認から再開します。


クラスの継承

 TypeScript では、継承した子クラスのコンストラクタに親クラスのコンストラクタをオーバーライドする場合、必ず親クラスのコンストラクタを拡張する必要があります。今日は、コンストラクタのオーバーライドについて、もう少し詳しく見ていきます。

コンストラクタのオーバーライド

 子クラスのコンストラクタは、親クラスのコンストラクタの部分と、子クラスで拡張する部分で構成する必要があります。コンストラクタの中で初期値を代入すればプロパティ宣言の初期値を省略できますが、これはインスタンス生成時にコンストラクタが必ず呼び出されるからです。インスタンス生成時に実行されるコンストラクタが拡張部分のみ初期化した場合、継承元のプロパティが初期化がされないため、機能の実行時に未初期化のプロパティを参照する場合ができてしまうということですね。

// オーバーライド
class User532{
    name: string;
    #age: number;

    constructor(name:string, age:number) {
        this.name = name;
        this.#age = age;
    }
    public isAdult(): boolean {
        return this.#age >= 20;
    }
}

class PremiumUser extends User532 {
    rank: number;

    constructor(name: string, rank: number) {
        super(name, 100);   // thisにアクセスするより前にsuperを呼び出す
        this.rank = rank;
    }
}

同じような理由だと思うのですが、「コンストラクタ内での this へのアクセスは、super呼び出し後でなければならない」これも、thisの中身が初期化される前に呼び出すことになるからかな?と思いました。

まとめ

今日こそ、override修飾子まで進みたかったのですが、ここまでにします。
@sat さんの、下記のTweetを見て、k8s の入門者向けの本を買いました。
https://twitter.com/satoru_takeuchi/status/1682689722907516929

k8sは、以前から気にはなっていたものの、どこから手をつければよいかわからなくて入門できていなかったのです。でも、これで一歩を踏み出すことができそうです。大変ありがたいです。こちらも、読みながら実際に試したいと思っているので新しいマガジンを追加するかもしれません。

さて、次回の更新は、次の週末の予定です。(出張中だけど、なんとかしたい)



いいなと思ったら応援しよう!