Menu
Coddy logo textTech

Constructores y herencia

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

Cuando una clase hija extiende a una madre, se debe llamar al constructor de la madre para inicializar correctamente los campos heredados. Dart proporciona formas flexibles de manejar esto a través de la lista de inicializadores usando super.

Si el padre tiene un constructor parametrizado, el hijo debe llamarlo explícitamente:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Student extends Person {
  String school;
  
  Student(String name, int age, this.school) : super(name, age);
}

Dart 2.17 introdujo los superparámetros, una sintaxis más limpia que reenvía los parámetros directamente al constructor padre:

class Student extends Person {
  String school;
  
  // super.name y super.age se reenvían directamente al constructor de Person
  Student(super.name, super.age, this.school);
}

Al trabajar con constructores con nombre, especificas a qué constructor padre llamar:

class Employee extends Person {
  String department;
  
  Employee(super.name, super.age, this.department);
  
  Employee.intern(String name, this.department) : super(name, 18);
}

La regla clave es sencilla: el padre debe estar completamente inicializado antes de que el hijo añada sus propias propiedades. Ya sea que uses la llamada tradicional super() o los nuevos parámetros super, Dart garantiza que la cadena de herencia se construya correctamente de padre a hijo.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de inventario de productos que demuestre cómo funcionan los constructores con la herencia. Crearás una jerarquía donde diferentes tipos de productos extienden una clase base de producto, cada uno requiriendo una inicialización adecuada a través de los constructores padres.

Organizarás tu código en dos archivos:

  • product.dart: Define tu jerarquía de productos aquí:
    • Una clase Product con las propiedades String name y double price, un constructor que toma ambos valores, y un método info() que imprime [name]: $[price]
    • Una clase Book que extiende Product y añade una propiedad String author. Usa parámetros super para reenviar name y price al constructor padre
    • Una clase Electronics que extiende Product y añade una propiedad int warranty (en meses). Usa la llamada tradicional super() en la lista de inicializadores para pasar los valores al padre
  • main.dart: Importa tu archivo de productos y demuestra ambos enfoques de herencia de constructores:
    • Crea un Book con name 'Dart Essentials', price 29.99, y author 'Jane Smith'
    • Llama a su método info(), luego imprime Author: [author]
    • Imprime una línea vacía
    • Crea un Electronics con name 'Wireless Mouse', price 45.50, y warranty 24
    • Llama a su método info(), luego imprime Warranty: [warranty] months

Ambas clases hijas heredan el método info() de Product sin necesidad de sobrescribirlo. La diferencia clave está en cómo llaman al constructor padre: Book utiliza la sintaxis más limpia de parámetros super, mientras que Electronics utiliza el enfoque tradicional con super() en la lista de inicializadores.

Salida esperada:

Dart Essentials: $29.99
Author: Jane Smith

Wireless Mouse: $45.5
Warranty: 24 months

Hoja de referencia

Cuando una clase hija extiende a una madre, se debe llamar al constructor de la madre para inicializar correctamente los campos heredados.

Enfoque tradicional - llamar explícitamente al constructor padre en la lista de inicializadores:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Student extends Person {
  String school;
  
  Student(String name, int age, this.school) : super(name, age);
}

Parámetros super (Dart 2.17+) - reenviar parámetros directamente al constructor padre:

class Student extends Person {
  String school;
  
  Student(super.name, super.age, this.school);
}

Constructores nombrados - especificar a qué constructor padre llamar:

class Employee extends Person {
  String department;
  
  Employee(super.name, super.age, this.department);
  
  Employee.intern(String name, this.department) : super(name, 18);
}

Pruébalo tú mismo

import 'product.dart';

void main() {
  // TODO: Crear un Book con:
  // - name: 'Dart Essentials'
  // - price: 29.99
  // - author: 'Jane Smith'

  // TODO: Llamar al método info() del book

  // TODO: Imprimir "Author: [author]"

  // TODO: Imprimir una línea vacía

  // TODO: Crear un Electronics con:
  // - name: 'Wireless Mouse'
  // - price: 45.50
  // - warranty: 24

  // TODO: Llamar al método info() del electronics

  // TODO: Imprimir "Warranty: [warranty] months"
}
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