Pular para o conteúdo principal

Classes e POO

Conceitos de Programação Orientada a Objetos variam entre linguagens. Veja como classes, herança, interfaces e polimorfismo funcionam em diferentes linguagens.

Definição de Classe e Instanciação​

// ES6 Classes
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}

greet() {
return `Hello, I'm ${this.name}`;
}
}

// Instantiation
const person = new Person("John", 30);

// Inheritance
class Student extends Person {
constructor(name, age, school) {
super(name, age);
this.school = school;
}

study() {
return `${this.name} is studying`;
}
}

Interfaces e Polimorfismo​

// No native interfaces, use duck typing
class Dog {
makeSound() {
return "Woof!";
}
}

class Cat {
makeSound() {
return "Meow!";
}
}

// Polymorphism
function animalSound(animal) {
return animal.makeSound();
}

// TypeScript interfaces
interface Animal {
makeSound(): string;
}

Principais Conclusões​

  • Modelos de herança — Java, C#, C++, PHP, Ruby, Swift e JavaScript usam herança simples baseada em classes com sintaxe extends ou :; por exemplo, class Student extends Person em Java ou class Student(Person) em Python. Go rejeita herança completamente e usa embedding: type Student struct { Person; school string } incorpora os campos e métodos de Person diretamente. Rust não tem herança alguma — apenas traits que os tipos implementam. Escolha Go ou Rust quando quiser composição ao invés de hierarquia; escolha Java/C#/Swift quando precisar de taxonomias de classe claras e sobrescrita de métodos.

  • Padrões de interface — Java, C#, Swift e PHP exigem declarações explícitas de implements: class Dog implements Animal. Go usa tipagem estrutural: qualquer tipo com um método MakeSound() string satisfaz type Animal interface { MakeSound() string } sem declará-lo. Python e Ruby dependem de duck typing — se tem make_sound(), funciona. As traits do Rust funcionam como interfaces: impl Animal for Dog { fn make_sound(&self) -> String { ... } }. C e Zig simulam interfaces via structs de ponteiros de função. Prefira interfaces implícitas estilo Go para flexibilidade; prefira interfaces explícitas quando quiser garantia de contrato em tempo de compilação.

  • Filosofia de POO — POO tradicional (Java, C#, C++) é centrada em classes, hierarquias de herança e virtual/override para polimorfismo. Go e Rust favorecem composição e traits: "prefira composição ao invés de herança." JavaScript e Python são multiparadigma — você pode usar classes ou evitá-las completamente. Se você está construindo modelos de domínio com hierarquias claras (ex.: Vehicle → Car → ElectricCar), Java/C#/Swift se destacam. Se quer designs planos e combináveis com cerimônia mínima, escolha Go ou Rust.

  • Memória e ciclo de vida — C++ e Rust exigem atenção explícita ao ciclo de vida do objeto: C++ usa destrutores virtual e RAII; o ownership do Rust previne referências pendentes. Java, C#, PHP, Ruby, Python e JavaScript usam coleta de lixo, então você raramente gerencia o tempo de vida do objeto. Go usa GC leve. Para programação de sistemas ou código crítico em performance, Rust e C++ dão controle; para desenvolvimento rápido, linguagens com coleta de lixo reduzem a carga cognitiva.