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
- Clase Base (Superclase): La clase de la cual se heredan propiedades y métodos.
- Clase Derivada (Subclase): La clase que hereda propiedades y métodos de la clase base.
- 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
-
Clase
Animal
:- Tiene un constructor que inicializa el nombre del animal.
- Tiene un método
makeSound
que imprime un mensaje genérico.
-
Clase
Dog
:- Extiende la clase
Animal
usando la palabra claveextends
. - 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.
- Extiende la clase
Ejercicio Práctico
Ejercicio 1: Crear una Jerarquía de Clases
-
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."
.
- Propiedad
-
Crea una clase derivada llamada
Car
que extiendaVehicle
y sobrescriba el métodohonk()
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
-
Olvidar Llamar al Constructor de la Superclase:
- Asegúrate de llamar al constructor de la superclase usando
super()
en el constructor de la subclase.
- Asegúrate de llamar al constructor de la superclase usando
-
No Sobrescribir Métodos Correctamente:
- Usa la anotación
@override
para asegurarte de que estás sobrescribiendo un método existente en la superclase.
- Usa la anotación
-
Acceso a Propiedades Privadas:
- Las propiedades privadas (que comienzan con
_
) en la superclase no son accesibles directamente en la subclase.
- Las propiedades privadas (que comienzan con
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.
Curso de Programación en Dart
Módulo 1: Introducción a Dart
- Introducción a Dart
- Configuración del Entorno de Desarrollo
- Tu Primer Programa en Dart
- Sintaxis y Estructura Básica