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 una clase padre, se debe llamar al constructor de la clase padre para inicializar correctamente los campos heredados. Dart ofrece formas flexibles de gestionar esto mediante la lista de inicializadores utilizando super.

Si la clase principal tiene un constructor parametrizado, la clase secundaria 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 parámetros super, una sintaxis más limpia que reenvía los parámetros directamente al constructor principal:

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 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 simple: la clase principal debe estar completamente inicializada antes de que la clase secundaria agregue sus propias propiedades. Tanto si usas la llamada tradicional super() como los parámetros super más recientes, Dart garantiza que la cadena de herencia se construya correctamente desde la clase principal hasta la secundaria.

challenge icon

Desafío

Fácil

Construyamos un sistema de inventario de productos que demuestre cómo funcionan los constructores con la herencia. Crearás una jerarquía en la que distintos tipos de productos extienden una clase de producto base, y cada uno requiere una inicialización adecuada mediante constructores padre.

Organizarás tu código en dos archivos:

  • product.dart: Define aquí tu jerarquía de productos:
    • Una clase Product con las propiedades String name y double price, un constructor que recibe 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 inicialización para pasar valores al padre
  • main.dart: Importa tu archivo de productos y demuestra ambos enfoques de herencia de constructores:
    • Crea un Book con el nombre 'Dart Essentials', el precio 29.99 y el autor 'Jane Smith'
    • Llama a su método info() y después imprime Author: [author]
    • Imprime una línea vacía
    • Crea un Electronics con el nombre 'Wireless Mouse', el precio 45.50 y la garantía 24
    • Llama a su método info() y después 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 usa la sintaxis más sencilla de parámetros super, mientras que Electronics usa el enfoque tradicional con super() en la lista de inicialización.

Salida esperada:

Dart Essentials: $29.99
Author: Jane Smith

Wireless Mouse: $45.5
Warranty: 24 months

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

Practica por tu cuenta: Compilador de Dart online