はじめに
TypeScript は、C#や Javaと同様にクラスを定義して利用することができます。
今回は、TypeScript におけるクラス定義の方法と使用方法について説明します。
目次
クラスとは
オブジェクト指向言語にとってクラスは重要な概念の一つです。
クラスとは、関連性のあるデータと操作(動作)をひとまとめにしたものであると考えることができます。
例えば、社員というクラスがある場合、データは、社員番号、氏名、部署、役職などがあり、操作(動作)には出社する、退社する、働くなどがあります。これらをひとまとめにして社員クラスを作成すると、社員.社員番号、社員.氏名、社員.働く、のようにして使用することができます。
これにより、「社員の番号」や「社員が働く」のように、「番号」や「働く」といったデータや動作が社員に関連していることを表現することができます。
クラス定義の基礎
クラス定義には、以下のものを含めることができます。
- クラス
- コンストラクタ
- プロパティ
- メソッド
クラスは、後述するプロパティやメソッドを入れるための器になります。先ほど説明した社員クラスでいうと、「社員」を定義する部分に当たります。
クラス定義の書式を以下に示します。
1 2 3 | class クラス名 { // ここにプロパティやコンストラクタ、メソッドを定義する } |
社員クラスの定義例を以下に示します。
1 2 3 4 | // 社員クラス class employee { // ここにコンストラクタ、プロパティ、メソッドを定義する } |
コンストラクタ
コンストラクタはクラスの初期化を担当する特別な関数です。
クラスに定義したプロパティの初期化や、初期化時に行いたい処理を実行します。コンストラクタは省略することができます。
以下にコンストラクタの定義書式を示します。引数がないコンストラクタや引数のあるコンストラクタなど、用途によって定義することができます。
1 2 3 4 5 6 7 | constructor() { // クラスの初期化処理をここに記述 } constructor(引数リスト) { // クラスの初期化処理をここに記述 } |
プロパティ
プロパティとは、クラスに持たせることができる変数のことです。
プロパティの定義方法は通常の変数と変わりません。以下に定義書式を示します。アクセス修飾子については後述します。
1 | アクセス修飾子 変数名 : データ型 = 初期値 |
以下に、社員番号を格納できる empno というプロパティの定義例を示します。
1 | public empno : string; |
また、上記の定義方法以外にゲッターやセッターもサポートしています。
ゲッターは値取得専用のプロパティ、セッターは値設定専用のプロパティです。どちらか片方だけ定義しても構いませんし、2つとも定義して値の読み書きができるようにすることもできます。
ゲッターやセッターの定義書式を以下に示します。
1 2 3 4 5 6 7 | get プロパティ名 : データ型 { return 値; } set プロパティ名 { // 値をセットする処理 } |
以下に、fullname というゲッターとセッターの定義例を示します。
this というキーワードはプロパティやメソッドなど、クラス内に定義されているものを使用する際に記述します。thisキーワードは省略することができますが、クラス内で定義されたプロパティとメソッド内に定義された変数が同一の場合などは、this キーワードを使用することで明確に区別することができます。
1 2 3 4 5 6 7 8 9 | private _fullname : string; public get fullname() { // クラス内に定義された _fullname を呼び出し元に返す return this ._fullname; } public set fullname(empname : string) { // 引数の empname をクラス内に定義された _fullname に保存 this ._fullname = empname;
} |
メソッド
メソッドはクラス内で定義する関数のことです。定義方法は通常の関数と変わりませんがキーワード function が不要ということと、先頭にアクセス修飾子を付けるという点が異なります。
アクセス修飾子 メソッド名() { // 処理 }
以下に doSomething というメソッドの定義例を示します。
public doSomething() { console.log("働いています"); }
上記を全てまとめた社員クラスの定義例は以下のようになります。
// 社員クラス class employee { private _fullname : string; public empno : string; constructor() { } public get fullname() { return this._fullname; } public set fullname(empname : string) { this._fullname = empname; } public doSomething() { console.log("働いています"); } }
定義したクラスを使用する
定義したクラスを使用するには、インスタンス化する必要があります。
クラスは建築の設計図に相当します。例えば、家の設計図そのものには住むことができないので、設計図をもとに家を建てるようなものです。
設計図から家を建てる = 実体を作成する ことがクラスにおけるインスタンス化に相当します。
社員クラスのインスタンス化の例を以下に示します。通常の変数の宣言で new の後ろにインスタンス化したいクラス() を書きます。
emp.empno = "123"; // 従業員番号に123を代入 emp.fullname = "HIRO"; // 名前を代入 emp.doSomething(); // メソッドを実行
アクセス修飾子
アクセス修飾子は、クラス内に定義されたプロパティやメソッドの公開、非公開設定をするためのものです。また後日紹介する継承機能においても使用するキーワードです。
アクセス修飾子には以下のものがあります。
private を付けるとクラス内でのみ使用できるプロパティやメソッドになります。
このため、インスタンス化した変数で「変数名.プロパティ」「変数名.メソッド」のように使用することができません。
また、継承したクラスからも参照することができません。
public を付けたプロパティやメソッドは、クラス内およびインスタンス化した変数で使用することができます。
また、継承したクラスからも参照することができます。
protected を付けたプロパティやメソッドは、クラス内と継承したクラスから使用することができます。
インスタンス化した変数では使用することができません。
コメント