Explorando a Abstração em POO com TypeScript

A abstração é um dos quatro pilares da Programação Orientada a Objetos (POO), essencial para simplificar complexidades e destacar as características essenciais de um objeto. Este artigo detalha cada trecho de um exemplo prático de abstração usando TypeScript, uma extensão de linguagem para JavaScript que oferece tipagem estática e suporte a POO. Vamos decompor um exemplo de um sistema de gerenciamento de dispositivos eletrônicos, explicando cada parte do código para iniciantes.

NLW unite | Evento gratuito de programação na prática | Rocketseat
Desafie-se em uma nova tecnologia criando um projeto completo em 3 aulas no maior evento online e gratuito de programação na prática para todos os níveis da Rocketseat.

Fundamentos da Abstração

A abstração ajuda os desenvolvedores a focar nos aspectos mais importantes de um objeto, ignorando detalhes menos relevantes para o contexto específico. Isso não apenas simplifica o design e a implementação de software mas também promove a reusabilidade e facilita a manutenção.

A Classe Abstrata DispositivoEletronico

abstract class DispositivoEletronico {
    constructor(protected marca: string, protected modelo: string) {}

    abstract ligar(): void;
    abstract desligar(): void;
}

Explicação do Código

  • abstract class DispositivoEletronico: Declara uma classe abstrata chamada DispositivoEletronico. Classes abstratas são modelos para outras classes e não podem ser instanciadas diretamente. Elas são usadas para definir um contrato para as classes filhas, especificando métodos que devem ser implementados.
  • constructor(protected marca: string, protected modelo: string) {}: O construtor da classe recebe dois parâmetros (marca e modelo) e os define como propriedades protegidas da classe. Propriedades protegidas podem ser acessadas dentro da classe e por classes derivadas.
  • abstract ligar(): void;: Declara um método abstrato ligar que não tem implementação na classe DispositivoEletronico. Classes filhas são obrigadas a fornecer uma implementação concreta deste método.
  • abstract desligar(): void;: Similar ao método ligar, desligar é outro método abstrato que deve ser implementado pelas classes filhas.
NLW unite | Evento gratuito de programação na prática | Rocketseat
Desafie-se em uma nova tecnologia criando um projeto completo em 3 aulas no maior evento online e gratuito de programação na prática para todos os níveis da Rocketseat.

A Classe Concreta Smartphone

class Smartphone extends DispositivoEletronico {
    constructor(marca: string, modelo: string, private sistemaOperacional: string) {
        super(marca, modelo);
    }

    ligar(): void {
        console.log(`Ligando o smartphone ${this.marca} ${this.modelo}...`);
    }

    desligar(): void {
        console.log(`Desligando o smartphone...`);
    }

    mostrarDetalhes(): void {
        console.log(`Smartphone ${this.marca} ${this.modelo}, Sistema Operacional: ${this.sistemaOperacional}`);
    }
}

Explicação do Código

  • class Smartphone extends DispositivoEletronico: Define uma classe Smartphone que herda da classe abstrata DispositivoEletronico. Isso significa que Smartphone deve implementar os métodos abstratos ligar e desligar.
  • constructor(marca: string, modelo: string, private sistemaOperacional: string): O construtor de Smartphone recebe três parâmetros e chama o construtor da classe base (DispositivoEletronico) com marca e modelo. sistemaOperacional é definido como uma propriedade privada da classe Smartphone, significando que só pode ser acessada dentro dessa classe.
  • Implementação de ligar e desligar: Estes métodos sobrescrevem os métodos abstratos da classe base, fornecendo funcionalidades específicas para ligar e desligar o smartphone.
  • mostrarDetalhes(): Um método adicional que imprime detalhes do Smartphone, demonstrando como métodos específicos podem ser adicionados às classes derivadas.
NLW unite | Evento gratuito de programação na prática | Rocketseat
Desafie-se em uma nova tecnologia criando um projeto completo em 3 aulas no maior evento online e gratuito de programação na prática para todos os níveis da Rocketseat.

Usando as Classes em um Aplicativo Node.js

import { Smartphone } from './Smartphone';

const meuSmartphone = new Smartphone("Samsung", "Galaxy S20", "Android");
meuSmartphone.ligar();
meuSmartphone.mostrarDetalhes();
meuSmartphone.desligar();

Explicação do Código

  • import { Smartphone } from './Smartphone';: Importa a classe Smartphone do arquivo onde ela está definida.
  • const meuSmartphone = new Smartphone("Samsung", "Galaxy S20", "Android");: Cria uma nova instância da classe Smartphone, passando os valores específicos para marca, modelo, e sistemaOperacional.
  • meuSmartphone.ligar();, meuSmartphone.mostrarDetalhes();, meuSmartphone.desligar();: Chama os métodos ligar, mostrarDetalhes, e desligar no objeto meuSmartphone, demonstrando como interagir com instâncias de classes em TypeScript.

Este guia detalhado explicou o conceito de abstração em POO com um exemplo prático em TypeScript, mostrando como criar classes abstratas e concretas, e como essas classes podem ser usadas para modelar objetos do mundo real de forma simplificada. A abstração é uma técnica poderosa que ajuda os programadores a focar nos aspectos mais importantes dos objetos, facilitando o desenvolvimento de software robusto e mantível.