Aula 9

TypeScript

POO (parte 2 - Herança e Polimorfismo)

Herança

A herança permite que uma classe reutilize propriedades e métodos de outra classe. Em TypeScript, isso é feito com a palavra-chave extends, e adicionamos tipagem explícita nas propriedades e nos parâmetros.


class Animal {
  constructor(public name: string, public species: string) {}

  describe(): string {
    return `${this.name} é um ${this.species}.`;
  }
}

class Mammal extends Animal {
  constructor(name: string, species: string, public isDomestic: boolean) {
    super(name, species);
  }

  mammalInfo(): string {
    return `${this.name} é um ${this.species} e é ${this.isDomestic ? 'domesticado' : 'selvagem'}.`;
  }
}

const cat = new Mammal('Mimi', 'gato', true);
console.log(cat.mammalInfo()); // Mimi é um gato e é domesticado.
        

Polimorfismo

O polimorfismo permite que métodos em classes filhas redefinam o comportamento dos métodos herdados da classe pai. Em TypeScript, podemos usar o modificador override para deixar isso explícito.


class Bird extends Animal {
  override describe(): string {
    return `${this.name} é um pássaro da espécie ${this.species}.`;
  }
}

const parrot = new Bird('Loro', 'papagaio');
console.log(parrot.describe()); // Loro é um pássaro da espécie papagaio.
        

Exemplo Completo - Sistema de Veículos

Veja abaixo um sistema que gerencia veículos com classes especializadas para carros e motos. Note o uso da tipagem estática nos atributos e métodos.


class Vehicle {
  constructor(
    public make: string,
    public model: string,
    public year: number
  ) {}

  getDetails(): string {
    return `${this.year} ${this.make} ${this.model}`;
  }
}

class Car extends Vehicle {
  constructor(make: string, model: string, year: number, public doors: number) {
    super(make, model, year);
  }

  override getDetails(): string {
    return `${super.getDetails()} com ${this.doors} portas.`;
  }
}

class Motorcycle extends Vehicle {
  constructor(make: string, model: string, year: number, public type: string) {
    super(make, model, year);
  }

  override getDetails(): string {
    return `${super.getDetails()} que é uma moto do tipo ${this.type}.`;
  }
}

const myCar = new Car('Toyota', 'Corolla', 2022, 4);
const myBike = new Motorcycle('Honda', 'CBR', 2021, 'esportiva');

console.log(myCar.getDetails()); // 2022 Toyota Corolla com 4 portas.
console.log(myBike.getDetails()); // 2021 Honda CBR que é uma moto do tipo esportiva.