Saltar al contenido principal

Clases y POO

Los conceptos de Programación Orientada a Objetos varían entre lenguajes. Así es como funcionan las clases, la herencia, las interfaces y el polimorfismo en diferentes lenguajes.

Definición de Clases e Instanciación​

// 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 y 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;
}

Puntos Clave​

  • Modelos de herencia — Java, C#, C++, PHP, Ruby, Swift y JavaScript usan herencia simple basada en clases con la sintaxis extends o :; por ejemplo, class Student extends Person en Java o class Student(Person) en Python. Go rechaza la herencia por completo y usa composición por incrustación: type Student struct { Person; school string } incrusta los campos y métodos de Person directamente. Rust no tiene herencia en absoluto—solo traits que los tipos implementan. Elige Go o Rust cuando quieras composición sobre jerarquía; elige Java/C#/Swift cuando necesites taxonomías de clases claras y sobreescritura de métodos.

  • Patrones de interfaces — Java, C#, Swift y PHP requieren declaraciones explícitas de implements: class Dog implements Animal. Go usa tipado estructural: cualquier tipo con un método MakeSound() string satisface type Animal interface { MakeSound() string } sin declararlo. Python y Ruby dependen del duck typing—si tiene make_sound(), funciona. Los traits de Rust funcionan como interfaces: impl Animal for Dog { fn make_sound(&self) -> String { ... } }. C y Zig simulan interfaces mediante structs de punteros a funciones. Prefiere interfaces implícitas al estilo Go para flexibilidad; prefiere interfaces explícitas cuando quieras aplicación de contratos en tiempo de compilación.

  • Filosofía de POO — La POO tradicional (Java, C#, C++) se centra en clases, jerarquías de herencia y virtual/override para polimorfismo. Go y Rust favorecen la composición y los traits: "prefiere composición sobre herencia." JavaScript y Python son multiparadigma—puedes usar clases o evitarlas por completo. Si estás construyendo modelos de dominio con jerarquías claras (por ejemplo, Vehiculo → Auto → AutoElectrico), Java/C#/Swift sobresalen. Si quieres diseños planos y componibles con mínima ceremonia, elige Go o Rust.

  • Memoria y ciclo de vida — C++ y Rust requieren atención explícita al ciclo de vida de los objetos: C++ usa destructores virtual y RAII; la propiedad de Rust previene referencias colgantes. Java, C#, PHP, Ruby, Python y JavaScript usan recolección de basura, así que raramente gestionas el tiempo de vida de los objetos. Go usa un GC ligero. Para programación de sistemas o código crítico en rendimiento, Rust y C++ te dan control; para desarrollo rápido, los lenguajes con recolección de basura reducen la carga cognitiva.