TypeScript ネストクラス解説
TypeScript では、クラスの中に別のクラスを定義することで、ネストされたクラスを作成できます。これは、コードのモジュール性とカプセル化を向上させるのに役立ちます。
基本的な例
class OuterClass {
innerClass() {
class InnerClass {
public innerMethod() {
console.log("Inner class method");
}
}
return new InnerClass();
}
}
const outer = new OuterClass();
const inner = outer.innerClass();
inner.innerMethod(); // Output: Inner class method
この例では、OuterClass
の内部に InnerClass
が定義されています。InnerClass
は OuterClass
のメソッド innerClass()
内で定義されており、そのメソッドからインスタンス化されます。
注意点
- インスタンス化
ネストされたクラスのインスタンスは、通常、外側のクラスのメソッドから作成されます。 - スコープ
ネストされたクラスは、その親クラスのスコープ内に存在します。つまり、外側のクラスのメンバーにアクセスできます。
なぜネストされたクラスを使うのか?
- 名前空間の管理
同じ名前のクラスを異なるスコープ内で定義できます。 - カプセル化
外部からアクセスできないように、内部実装を隠蔽できます。 - モジュール性
関連するクラスをグループ化することで、コードの構造を明確にし、再利用性を高めます。
- UI コンポーネント
UI フレームワークでのコンポーネントの構成 - 複雑なデータ構造
複雑なオブジェクト階層のモデリング - デザインパターン
ファクトリーパターンやシングルトンパターンの実装
// TypeScript ネストクラスの例
class OuterClass {
innerClass() {
class InnerClass {
public innerMethod() {
console.log("Inner class method");
}
}
return new InnerClass();
}
}
const outer = new OuterClass();
const inner = outer.innerClass();
inner.innerMethod(); // Output: Inner class method
コードの説明
- OuterClass
外側のクラスです。 - innerClass() メソッド
このメソッドは、InnerClass
のインスタンスを生成して返します。 - innerMethod() メソッド
InnerClass
のメソッドで、コンソールにメッセージを出力します。
OuterClass
のインスタンスouter
を作成します。outer.innerClass()
を呼び出し、InnerClass
のインスタンスinner
を取得します。inner.innerMethod()
を呼び出し、コンソールに "Inner class method" と出力されます。
モジュールシステム
- Namespaces
TypeScript の名前空間は、コードを論理的にグループ化し、名前衝突を防ぐことができます。 - ES Modules
TypeScript は ES Modules をサポートしており、複数のファイルにクラスを分割してモジュール化できます。
インターフェース
- インターフェースは、クラスの構造とメソッドのシグネチャを定義します。ネストされたクラスの代わりに、インターフェースを使用して、クラス間の関係を明確に定義できます。
抽象クラス
- 抽象クラスは、共通のメソッドやプロパティを定義し、サブクラスで実装を強制します。ネストされたクラスの代わりに、抽象クラスを使用して、クラス階層を構築できます。
具体的な例
class OuterClass {
innerClass() {
class InnerClass {
// ...
}
return new InnerClass();
}
}
ES Modules
// outer.ts
export class OuterClass {
// ...
}
// inner.ts
import { OuterClass } from './outer';
export class InnerClass {
// ...
outerClass: OuterClass;
}
Namespaces
namespace OuterNamespace {
export class OuterClass {
// ...
}
export class InnerClass {
// ...
}
}
インターフェース
interface InnerClassInterface {
// ...
}
class OuterClass {
createInnerClass(): InnerClassInterface {
// ...
}
}
抽象クラス
abstract class OuterClass {
abstract createInnerClass(): InnerClass;
}
class ConcreteOuterClass extends OuterClass {
createInnerClass(): InnerClass {
// ...
}
}
class InnerClass {
// ...
}
選択する手法の考慮点
- パフォーマンス
ネストされたクラスは、パフォーマンスに影響を与える可能性があります。特に、大量のインスタンスを作成する場合には注意が必要です。 - カプセル化
インターフェースや抽象クラスは、クラス間の依存関係を明確にし、カプセル化を強化できます。 - コードの組織化
モジュールシステムや名前空間は、コードを複数のファイルに分割して管理するのに適しています。
javascript typescript