皆さん、こんにちは!今日はTypeScriptでのオブジェクト指向プログラミングについて一緒に見ていきましょう。プログラムを書いていると、データや機能を整理して扱いやすくしたいと思うことってありますよね?そんなとき、オブジェクト指向プログラミング(OOP)は、まるで魔法のようにその願いを叶えてくれます。そして、TypeScriptはその魔法を使うのに最適なツールです。TypeScriptのクラスを使えば、コードをより読みやすく、メンテナンスしやすく、そして再利用しやすくなります。初めてクラスを学ぶときは少し難しく感じるかもしれませんが、一緒に一歩一歩進んでいけば大丈夫!気持ちを込めて、TypeScriptのクラスを使ってOOPの世界に飛び込んでみましょう!
クラスとは何か?
まず、クラスって何だろう?簡単に言うと、クラスはオブジェクトを作るための「設計図」のようなものです。この設計図を使って、同じ性質を持つオブジェクトを何個でも作ることができます。
例えば、犬のクラスを作るとしましょう。このクラスには犬の名前や年齢、そして吠える機能が含まれているとします。この設計図を元に、異なる犬(オブジェクト)を作ることができるわけです。
例:
class Dog { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } bark() { console.log(`${this.name}はワンワンと吠えます!`); } } const myDog = new Dog('ポチ', 3); myDog.bark();
このコードでは、Dog
というクラスを作りました。このクラスは、犬の名前と年齢を持ち、その犬が吠える機能を持っています。そして、myDog
という名前の犬(オブジェクト)を作り、その犬に「ポチ」という名前をつけました。ポチが吠えると、コンソールには「ポチはワンワンと吠えます!」と表示されます。
クラスのプロパティとメソッド
クラスの「プロパティ」とは、そのクラスが持つデータのことです。この例では、犬の名前と年齢がプロパティです。そして、「メソッド」とは、そのクラスが持つ機能、つまり関数のことです。bark
がそのメソッドにあたります。
プロパティとメソッドを組み合わせることで、現実世界の物体や概念をプログラムで表現することができます。これがオブジェクト指向プログラミングの基本的な考え方です。
例:
class Car { brand: string; model: string; year: number; constructor(brand: string, model: string, year: number) { this.brand = brand; this.model = model; this.year = year; } startEngine() { console.log(`${this.brand} ${this.model}のエンジンが始動しました!`); } stopEngine() { console.log(`${this.brand} ${this.model}のエンジンが停止しました!`); } } const myCar = new Car('トヨタ', 'カローラ', 2020); myCar.startEngine(); myCar.stopEngine();
この例では、Car
クラスを作成しました。車のブランド、モデル、年式をプロパティとして持ち、エンジンを始動したり停止したりするメソッドを持っています。myCar
オブジェクトを作成し、そのエンジンを始動・停止することができます。
継承を使ったクラスの拡張
オブジェクト指向プログラミングでは、クラスを継承して新しいクラスを作ることができます。継承を使うと、あるクラスのすべての機能を受け継ぎつつ、新しい機能を追加できます。
例えば、Dog
クラスをベースにして、「猟犬」クラスを作るとしましょう。猟犬は普通の犬と同じように吠えますが、さらに特別な「追跡」機能も持っているかもしれません。
例:
class HuntingDog extends Dog { track() { console.log(`${this.name}は獲物を追跡しています!`); } } const hunter = new HuntingDog('レオ', 5); hunter.bark(); hunter.track();
このコードでは、HuntingDog
という新しいクラスをDog
クラスから継承しています。HuntingDog
はDog
のすべてのプロパティとメソッドを持っており、さらにtrack
メソッドを持っています。レオが吠えた後、追跡する姿がコンソールに表示されます。
アクセス修飾子:public、private、protected
TypeScriptでは、クラスのプロパティやメソッドにアクセス修飾子を設定することができます。これにより、外部からのアクセスを制御できます。
public
: どこからでもアクセス可能(デフォルト)private
: クラスの内部からのみアクセス可能protected
: クラス自身およびその継承クラスからアクセス可能
例:
class BankAccount { public accountNumber: string; private balance: number; constructor(accountNumber: string, balance: number) { this.accountNumber = accountNumber; this.balance = balance; } public deposit(amount: number) { this.balance += amount; console.log(`${amount}円が口座に入金されました。現在の残高: ${this.balance}円`); } public withdraw(amount: number) { if (amount > this.balance) { console.log('残高不足です。'); } else { this.balance -= amount; console.log(`${amount}円が引き出されました。現在の残高: ${this.balance}円`); } } } const myAccount = new BankAccount('123-456', 10000); myAccount.deposit(5000); myAccount.withdraw(3000); // myAccount.balance = 0; // エラー: balanceはprivateです
この例では、BankAccount
クラスのbalance
プロパティはprivate
として設定されています。そのため、クラスの外から直接変更することはできません。代わりに、deposit
やwithdraw
メソッドを使って操作します。
結論
TypeScriptのクラスを使ったオブジェクト指向プログラミングは、コードの再利用性を高め、可読性を向上させる素晴らしい手法です。初めてクラスや継承を学ぶときは、少し戸惑うかもしれませんが、実際に手を動かしてコードを書いてみると、その便利さがすぐにわかるはずです。ぜひ、この記事を参考に、自分のプロジェクトでもTypeScriptのクラスを使ってみてください!
次回は、TypeScriptとAPIの連携について書こうと思いますので、お楽しみに!よかったらTwitterでフォローしてね!