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énhashCode
, 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...');
}
}