🟦 TypeScript のオブジェクト指向入門

1. クラス(Class)

class Animal {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  speak(): void {
    console.log(`${this.name} が鳴いています`);
  }
}

const dog = new Animal("ポチ");
dog.speak(); // ポチ が鳴いています

2. 継承(Inheritance)

class Dog extends Animal {
  bark(): void {
    console.log(`${this.name} がワンワンと吠えました`);
  }
}

const shiba = new Dog("しば");
shiba.speak(); // しば が鳴いています
shiba.bark();  // しば がワンワンと吠えました

3. アクセス修飾子(Access Modifier)

修飾子意味
publicどこからでもアクセス可能(デフォルト)
privateクラス内からのみアクセス可能
protectedクラス内と継承先からアクセス可能
class User {
  public name: string;
  private password: string;

  constructor(name: string, password: string) {
    this.name = name;
    this.password = password;
  }

  checkPassword(pw: string): boolean {
    return this.password === pw;
  }
}

const u = new User("Kenji", "1234");
console.log(u.name);           // OK
// console.log(u.password);    // ❌ エラー: privateプロパティ

4. インターフェースとクラスの連携

interface Speakable {
  speak(): void;
}

class Parrot implements Speakable {
  speak(): void {
    console.log("こんにちは!オウムです");
  }
}

5. 抽象クラス(abstract class)

abstract class Creature {
  abstract makeSound(): void;

  move(): void {
    console.log("生き物が動きました");
  }
}

class Cat extends Creature {
  makeSound(): void {
    console.log("にゃーん");
  }
}

const neko = new Cat();
neko.makeSound(); // にゃーん
neko.move();      // 生き物が動きました

6. Getter / Setter

class Product {
  private _price: number = 0;

  set price(value: number) {
    if (value >= 0) {
      this._price = value;
    }
  }

  get price(): number {
    return this._price;
  }
}

const p = new Product();
p.price = 100;
console.log(p.price); // 100

🎓 オブジェクト指向まとめ

機能目的
クラス設計図としてオブジェクトの構造を定義
継承コードの再利用や共通化
アクセス修飾子情報の隠蔽
インターフェースクラスが従うべき構造を定義
抽象クラス共通処理+処理の実装を強制
getter/setter値への安全なアクセスや加工