Menu
Coddy logo textTech

Herencia básica

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 36 de 110.

La herencia permite que una clase adquiera las propiedades y métodos de otra clase. En lugar de volver a escribir el mismo código, se crea una nueva clase que se basa en una ya existente. La clase original se llama padre (o superclase), y la nueva clase es la hija (o subclase).

En Dart, usas la palabra clave extends para heredar de una clase padre:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

void main() {
  var dog = Dog('Buddy');
  dog.eat();   // Heredado de Animal
  dog.bark();  // Definido en Dog
}

La clase Dog tiene acceso automáticamente a la propiedad name y al método eat() de Animal, además de su propio método bark(). Esto crea una relación "es-un": un Dog es un Animal.

La clase hija puede añadir nuevas propiedades y métodos, pero hereda todo lo público del padre. Ten en cuenta que los miembros privados (aquellos con _) no son accesibles directamente en subclases de diferentes librerías, aunque sigan existiendo en el objeto heredado.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de vehículos que demuestre cómo la herencia permite a las clases hijas reutilizar y extender la funcionalidad de la clase padre. Crearás una clase padre para vehículos generales y una clase hija para un tipo específico de vehículo.

Organizarás tu código en dos archivos:

  • vehicle.dart: Define tus clases aquí:
    • Una clase Vehicle (el padre) con una propiedad String brand, un constructor que recibe la marca y un método start() que imprime '$brand engine starting...'
    • Una clase Motorcycle que extiende a Vehicle. Debe tener una propiedad adicional int cc (cilindrada del motor), un constructor que reciba tanto la marca como los cc (pasando la marca al padre usando super), y su propio método wheelie() que imprime '$brand is doing a wheelie!'
  • main.dart: Importa tu archivo de vehículos y demuestra la herencia en acción:
    • Crea un Vehicle con la marca 'Toyota'
    • Llama a su método start()
    • Crea una Motorcycle con la marca 'Harley' y cc 1200
    • Llama al método start() de la motocicleta (heredado de Vehicle)
    • Llama al método wheelie() de la motocicleta (definido en Motorcycle)
    • Imprime 'Motorcycle engine: ${motorcycle.cc}cc' para mostrar la propiedad propia de la hija

Observa cómo la clase Motorcycle obtiene automáticamente acceso a la propiedad brand y al método start() de Vehicle, al mismo tiempo que tiene su propia propiedad única cc y el método wheelie(). Este es el poder de la herencia: construir sobre el código existente.

Salida esperada:

Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200cc

Hoja de referencia

Usa la palabra clave extends para crear una clase hija que hereda de una clase padre:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

La clase hija hereda todas las propiedades y métodos públicos de la clase padre. Usa super en el constructor hijo para pasar parámetros al constructor padre.

Las clases hijas pueden añadir sus propias propiedades y métodos mientras siguen accediendo a los heredados:

var dog = Dog('Buddy');
dog.eat();   // Heredado de Animal
dog.bark();  // Definido en Dog

Esto crea una relación "es-un" - un Dog es un Animal.

Pruébalo tú mismo

import 'vehicle.dart';

void main() {
  // TODO: Crea un Vehicle con brand 'Toyota'
  
  // TODO: Llama al método start() del vehículo
  
  // TODO: Crea una Motorcycle con brand 'Harley' y cc 1200
  
  // TODO: Llama al método start() de la motocicleta (heredado de Vehicle)
  
  // TODO: Llama al método wheelie() de la motocicleta
  
  // TODO: Imprime 'Motorcycle engine: [cc]cc' usando la propiedad cc de la motocicleta
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos