La herencia es un concepto fundamental en la programación orientada a objetos (OOP) que permite a una clase derivar propiedades y métodos de otra clase. En Dart, la herencia se utiliza para crear una jerarquía de clases que comparten características comunes, lo que facilita la reutilización del código y la organización lógica de las clases.

Conceptos Clave

  1. Clase Base (Superclase): La clase de la cual se heredan propiedades y métodos.
  2. Clase Derivada (Subclase): La clase que hereda propiedades y métodos de la clase base.
  3. Palabra Clave extends: Utilizada para indicar que una clase está heredando de otra clase.

Ejemplo Básico de Herencia

Vamos a crear un ejemplo simple para ilustrar cómo funciona la herencia en Dart.

Clase Base

class Animal {
  String name;

  Animal(this.name);

  void makeSound() {
    print('$name hace un sonido.');
  }
}

Clase Derivada

class Dog extends Animal {
  Dog(String name) : super(name);

  @override
  void makeSound() {
    print('$name ladra.');
  }
}

Uso de las Clases

void main() {
  Animal animal = Animal('Animal');
  animal.makeSound(); // Salida: Animal hace un sonido.

  Dog dog = Dog('Rex');
  dog.makeSound(); // Salida: Rex ladra.
}

Explicación del Código

  1. Clase Animal:

    • Tiene un constructor que inicializa el nombre del animal.
    • Tiene un método makeSound que imprime un mensaje genérico.
  2. Clase Dog:

    • Extiende la clase Animal usando la palabra clave extends.
    • Llama al constructor de la clase base usando super(name).
    • Sobrescribe el método makeSound para proporcionar una implementación específica para los perros.

Ejercicio Práctico

Ejercicio 1: Crear una Jerarquía de Clases

  1. Crea una clase base llamada Vehicle con las siguientes propiedades y métodos:

    • Propiedad String brand.
    • Método void honk() que imprime "<brand> hace un sonido de bocina.".
  2. Crea una clase derivada llamada Car que extienda Vehicle y sobrescriba el método honk() para imprimir "<brand> hace un sonido de bocina de coche.".

Solución

class Vehicle {
  String brand;

  Vehicle(this.brand);

  void honk() {
    print('$brand hace un sonido de bocina.');
  }
}

class Car extends Vehicle {
  Car(String brand) : super(brand);

  @override
  void honk() {
    print('$brand hace un sonido de bocina de coche.');
  }
}

void main() {
  Vehicle vehicle = Vehicle('Vehículo');
  vehicle.honk(); // Salida: Vehículo hace un sonido de bocina.

  Car car = Car('Toyota');
  car.honk(); // Salida: Toyota hace un sonido de bocina de coche.
}

Errores Comunes y Consejos

  1. Olvidar Llamar al Constructor de la Superclase:

    • Asegúrate de llamar al constructor de la superclase usando super() en el constructor de la subclase.
  2. No Sobrescribir Métodos Correctamente:

    • Usa la anotación @override para asegurarte de que estás sobrescribiendo un método existente en la superclase.
  3. Acceso a Propiedades Privadas:

    • Las propiedades privadas (que comienzan con _) en la superclase no son accesibles directamente en la subclase.

Conclusión

La herencia es una herramienta poderosa en Dart que permite la reutilización del código y la creación de jerarquías de clases lógicas. Al entender cómo funciona la herencia y cómo implementarla correctamente, puedes crear aplicaciones más organizadas y mantenibles. En el próximo tema, exploraremos los mixins, que proporcionan una forma alternativa de compartir código entre clases.

© Copyright 2024. Todos los derechos reservados