diegoRodicio

Está documentación está a túa disposición sin ningún custo económico. Sen embargo, para a súa elaboración dedico moito tempo e recursos, polo que agradecería unha colaboración co que consideres oportuno. Gracias.

View Categories

🧬 Herdanza

En Dart, podemos crear unha nova clase a partir doutra existente utilizando a palabra clave extends. A clase orixinal coñécese como superclase (ou clase pai) e a nova como subclase (ou clase filla).

A subclase herda os atributos e métodos da superclase, pero tamén pode engadir ou modificar comportamentos segundo o necesario.

✅ Exemplo básico de herdanza #

// Superclase
class Vehiculo {
  void arrancar() {
    print('O vehículo arranca...');
  }
}

// Subclase que estende Vehiculo
class Coche extends Vehiculo {
  void tocarClaxon() {
    print('Piiii!');
  }
}

void main() {
  var meuCoche = Coche();
  meuCoche.arrancar();      // Método herdado
  meuCoche.tocarClaxon();   // Método propio da subclase
}

✅ Outro exemplo de herdanza #

// Superclase ou Clase Base
class AparelloElectronico {
  String marca;
  bool estaEncendido = false;

  AparelloElectronico(this.marca);

  void encender() {
    estaEncendido = true;
    print('$marca está encendido.');
  }

  void apagar() {
    estaEncendido = false;
    print('$marca está apagado.');
  }
}

// Subclase ou Clase Derivada que estende de AparelloElectronico
class Television extends AparelloElectronico {
  int canleActual = 1;

  Television(String marca) : super(marca); [cite_start]// Chama ao construtor da superclase [cite: 78]

  void cambiarCanle(int novaCanle) {
    if (estaEncendido) {
      canleActual = novaCanle;
      print('Canle cambiada a $canleActual.');
    } else {
      print('A televisión está apagada. Non se pode cambiar a canle.');
    }
  }

  // Podes engadir máis funcionalidades específicas da Televisión
  void actualizarApps() {
    print('Actualizando aplicacións na televisión $marca...');
  }
}

void main() {
  var miTV = Television('Samsung');

  miTV.encender(); // Método herdado de AparelloElectronico
  miTV.cambiarCanle(5); // Método propio de Television
  miTV.apagar(); // Método herdado de AparelloElectronico
  miTV.actualizarApps(); // Método propio de Television
}

📝 Sobrescritura de Membros (@override) #

As subclases poden modificar o comportamento dun método herdado utilizando a anotación @override.

class Animal {
  void emitirSon() {
    print('Este animal fai un son...');
  }
}

class Can extends Animal {
  @override
  void emitirSon() {
    print('Ladra!');
  }
}

void main() {
  var meuCan = Can();
  meuCan.emitirSon(); // Output: Ladra!
}

✅ Exemplo #

class AparelloElectronico {
  String marca;
  bool estaEncendido = false;

  AparelloElectronico(this.marca);

  void encender() {
    estaEncendido = true;
    print('$marca está encendido.');
  }

  // Exemplo de getter que pode ser sobrescrito
  String get estado => estaEncendido ? 'Encendido' : 'Apagado';
}

class SmartTelevision extends AparelloElectronico {
  int brillo = 50; // De 0 a 100

  SmartTelevision(String marca) : super(marca);

  // Sobrescritura do método 'encender' para engadir máis lóxica
  @override // Boa práctica 
  void encender() {
    super.encender(); // Chamar á implementación da superclase [cite: 78]
    print('SmartTV ${marca} inicializando funcionalidades intelixentes.');
  }

  // Sobrescritura dun setter para engadir validación
  // Note que o parámetro de entrada pode ser un supertipo, aínda que aquí é o mesmo 
  set contraste(int valor) { // No orixinal podería ser int, aquí aceptamos int [cite: 126]
    if (valor < 0 || valor > 100) {
      throw ArgumentError('O contraste debe estar entre 0 e 100.');
    }
    brillo = valor;
    print('Contraste de SmartTV ${marca} axustado a $brillo.');
  }

  // Sobrescritura do getter 'estado'
  @override
  String get estado => super.estado + ' (Brillo: $brillo%)';
}

void main() {
  var miSmartTV = SmartTelevision('LG');

  miSmartTV.encender(); // Chama ao método sobrescrito de SmartTelevision
  print('Estado da TV: ${miSmartTV.estado}');

  miSmartTV.contraste = 75; // Usa o setter sobrescrito
  print('Estado da TV: ${miSmartTV.estado}');

  try {
    miSmartTV.contraste = 120; // Intenta un valor inválido
  } catch (e) {
    print('Erro: $e');
  }
}

🔹 Sobrescritura de operadores #

Os operadores tamén se poden sobrescribir nas subclases, igual que os métodos. Sempre debemos engadir @override.

class Punto {
  final int x, y;
  Punto(this.x, this.y);

  @override
  bool operator ==(Object outro) =>
      outro is Punto && x == outro.x && y == outro.y;

  @override
  int get hashCode => Object.hash(x, y);
}

📝 Nota: Se sobrescribes ==, é obrigatorio sobrescribir tamén hashCode, para que funcione correctamente en mapas ou sets.

🔹 Uso de super #

A palabra clave super permite acceder a métodos ou atributos da superclase desde a subclase.

class Televisor {
  void acender() {
    print('Encendendo a pantalla...');
  }
}

class SmartTV extends Televisor {
  @override
  void acender() {
    super.acender(); // Chamamos ao método orixinal
    print('Conectando a internet...');
  }
}

Exemplos #

🔗 Ver o código en DartPad