// 01

/*abstract class Animal {
    abstract emitirSom(): string;
}

class Cachorro extends Animal {
    emitirSom(): string {
        return "Au Au!";
    }
}

class Gato extends Animal {
    emitirSom(): string {
        return "Miau!";
    }
}

const animais: Animal[] = [new Cachorro(), new Gato()];
animais.forEach(animal => console.log(animal.emitirSom()));
// Saída: "Au Au!", "Miau!"*/

// 02
/*abstract class Veiculo {
    abstract mover(): string;
}

class Carro extends Veiculo {
    mover(): string {
        return "O carro está acelerando!";
    }
}

class Bicicleta extends Veiculo {
    mover(): string {
        return "A bicicleta está pedalando!";
    }
}

const veiculos: Veiculo[] = [new Carro(), new Bicicleta()];
veiculos.forEach(v => console.log(v.mover()));
// Saída: "O carro está acelerando!", "A bicicleta está pedalando!"*/

// 03
/*abstract class ContaBancaria {
    constructor(protected saldo: number) {}
    abstract sacar(valor: number): string;
}

class ContaCorrente extends ContaBancaria {
    sacar(valor: number): string {
        if (valor <= this.saldo) {
            this.saldo -= valor;
            return `Saque de R$${valor} realizado. Saldo: R$${this.saldo}`;
        }
        return "Saldo insuficiente!";
    }
}

class ContaPoupanca extends ContaBancaria {
    sacar(valor: number): string {
        if (valor <= this.saldo && valor <= 1000) {
            this.saldo -= valor;
            return `Saque de R$${valor} realizado. Saldo: R$${this.saldo}`;
        }
        return "Limite de saque excedido ou saldo insuficiente!";
    }
}

const contas: ContaBancaria[] = [new ContaCorrente(500), new ContaPoupanca(1500)];
console.log(contas[0].sacar(200)); // Saque permitido
console.log(contas[1].sacar(1200)); // Limite excedido*/

// 04
/*abstract class Dispositivo {
    abstract ligar(): string;
}

class Smartphone extends Dispositivo {
    ligar(): string {
        return "Smartphone ligando... Tela de bloqueio ativada!";
    }
}

class Notebook extends Dispositivo {
    ligar(): string {
        return "Notebook iniciando... Windows carregando!";
    }
}

const dispositivos: Dispositivo[] = [new Smartphone(), new Notebook()];
dispositivos.forEach(d => console.log(d.ligar()));*/

// 05
/*abstract class Funcionario {
    abstract calcularSalario(): number;
}

class CLT extends Funcionario {
    constructor(private salarioBase: number) {
        super();
    }
    calcularSalario(): number {
        return this.salarioBase * 0.85; // Desconto de 15%
    }
}

class PJ extends Funcionario {
    constructor(private valorHora: number, private horasTrabalhadas: number) {
        super();
    }
    calcularSalario(): number {
        return this.valorHora * this.horasTrabalhadas;
    }
}

const funcionarios: Funcionario[] = [new CLT(3000), new PJ(100, 40)];
funcionarios.forEach(f => console.log(f.calcularSalario()));
// Saída: 2550, 4000 */

// 06
/*abstract class Forma {
    abstract desenhar(): string;
}

class Circulo extends Forma {
    desenhar(): string {
        return "Desenhando um círculo ⭕";
    }
}

class Retangulo extends Forma {
    desenhar(): string {
        return "Desenhando um retângulo ▭";
    }
}

const formas: Forma[] = [new Circulo(), new Retangulo()];
formas.forEach(f => console.log(f.desenhar())); */

// 07
/*abstract class Produto {
    constructor(protected preco: number) {}
    abstract calcularDesconto(): number;
}

class Livro extends Produto {
    calcularDesconto(): number {
        return this.preco * 0.9; // 10% off
    }
}

class Eletronico extends Produto {
    calcularDesconto(): number {
        return this.preco * 0.95; // 5% off
    }
}

const produtos: Produto[] = [new Livro(50), new Eletronico(1000)];
produtos.forEach(p => console.log(p.calcularDesconto()));
// Saída: 45, 950  */

// 08
/*abstract class Personagem {
    abstract atacar(): string;
}

class Guerreiro extends Personagem {
    atacar(): string {
        return "Guerreiro ataca com espada! ⚔️";
    }
}

class Mago extends Personagem {
    atacar(): string {
        return "Mago lança bola de fogo! 🔥";
    }
}

const personagens: Personagem[] = [new Guerreiro(), new Mago()];
personagens.forEach(p => console.log(p.atacar())); */

// 09
/*abstract class ServicoEnvio {
    abstract enviar(destinatario: string): string;
}

class Email extends ServicoEnvio {
    enviar(destinatario: string): string {
        return `Email enviado para ${destinatario} 📧`;
    }
}

class SMS extends ServicoEnvio {
    enviar(destinatario: string): string {
        return `SMS enviado para ${destinatario} 📱`;
    }
}

const servicos: ServicoEnvio[] = [new Email(), new SMS()];
servicos.forEach(s => console.log(s.enviar("fulano@exemplo.com"))); */

// 10
abstract class InstrumentoMusical {
    abstract tocar(): string;
}

class Violao extends InstrumentoMusical {
    tocar(): string {
        return "🎸 Strum strum strum...";
    }
}

class Piano extends InstrumentoMusical {
    tocar(): string {
        return "🎹 Plim plim plim...";
    }
}

const instrumentos: InstrumentoMusical[] = [new Violao(), new Piano()];
instrumentos.forEach(i => console.log(i.tocar()));

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: