Un método es una función que proporciona comportamientos a un objeto, dividido en cuatro categorías: métodos de instancia, sobrecarga de operadores, Getters/Setters y métodos abstractos.
1. Instance methods Métodos de instancia
- Métodos pertenecientes a los objetos de instancia de la clase;
- Pueden acceder directamente a las variables de instancia y usar la palabra clave
this; - Tienen un cuerpo de función completo para realizar cálculos de negocio y operaciones lógicas.
import 'dart:math';
class Point {
final double x;
final double y;
// Constructor que inicializa las variables de instancia
Point(this.x, this.y);
// Método de instancia: calcular la distancia entre dos puntos
double distanceTo(Point other) {
var dx = x - other.x;
var dy = y - other.y;
return sqrt(dx * dx + dy * dy);
}
}
void main() {
Point p1 = Point(0, 0);
Point p2 = Point(3, 4);
print(p1.distanceTo(p2)); // Muestra 5.0
}Lenguaje del código: JavaScript (javascript)
2. Operators Sobrecarga de operadores
- La mayoría de los operadores son esencialmente métodos de instancia con nombres especiales;
- Sintaxis de declaración:
operator operador(parámetro) TipoRetorno { ... }; - Lista de operadores soportados para sobrecarga:
< > <= >= == ~- + / ~/ * %| ˆ & << >>> >>[]= [] - Los operadores integrados no se pueden sobrecargar (ej:
!=, implementado automáticamente por Dart sin definición manual); - Al sobrecargar
==es obligatorio sobrescribir tambiénhashCode, de lo contrario habrá fallos en la comparación de igualdad.
class Vector {
final int x, y;
Vector(this.x, this.y);
// Sobrecargar + para suma de vectores
Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
// Sobrecargar - para resta de vectores
Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
// Sobrecargar == para comparación de igualdad
@override
bool operator ==(Object other) =>
other is Vector && x == other.x && y == other.y;
// Sobreescritura complementaria de hashCode
@override
int get hashCode => Object.hash(x, y);
}
void main() {
final v = Vector(2, 3);
final w = Vector(2, 2);
assert(v + w == Vector(4, 5));
assert(v - w == Vector(0, 1));
print(v + w);
}Lenguaje del código: JavaScript (javascript)
Al sobrecargar los operadores, podemos realizar operaciones como +, -, == en dos objetos Vector igual que si fueran números.
3. Getters and setters Accesores
get: método de solo lectura para obtener propiedades calculadas, sin parámetros;set: método de escritura para modificar variables asociadas, solo admite un parámetro;- Todas las variables de instancia traen un getter implícito; las variables mutables incluyen un setter implícito;
- Ventaja: se puede convertir una variable normal en lógica de cálculo más tarde sin modificar el código de llamada externo;
- Los operadores incremento/decremento
++/--llaman al getter una única vez y almacenan el valor para evitar efectos secundarios.
/// Rectángulo del sistema de coordenadas de pantalla, origen (0,0) en la esquina superior izquierda
class Rectangle {
double left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
// Getter: calcular límite derecho
double get right => left + width;
// Setter: asignar límite derecho y actualizar left al revés
set right(double value) => left = value - width;
// Getter: calcular límite inferior
double get bottom => top + height;
// Setter: asignar límite inferior y actualizar top al revés
set bottom(double value) => top = value - height;
}
void main() {
var rect = Rectangle(3, 4, 20, 15);
assert(rect.left == 3);
// Llamada al setter
rect.right = 12;
assert(rect.left == -8);
print(rect.left); // -8
}Lenguaje del código: JavaScript (javascript)
4. Abstract methods Métodos abstractos
- Solo definen una interfaz sin cuerpo de función; se usa un punto y coma
;en lugar de implementación; - Solo pueden existir dentro de
abstract classclases abstractas o mixins; - Las subclases deben sobrescribir e implementar todos los métodos abstractos; si no, la subclase también debe marcarse como
abstract.
// Clase abstracta que contiene métodos abstractos
abstract class Doer {
// Método abstracto: solo declaración, sin implementación
void doSomething();
}
// Subclase normal, debe implementar todos los métodos abstractos del padre
class EffectiveDoer extends Doer {
@override
void doSomething() {
print("Ejecutar lógica de negocio concreta");
}
}
void main() {
Doer worker = EffectiveDoer();
worker.doSomething(); // Muestra: Ejecutar lógica de negocio concreta
}Lenguaje del código: JavaScript (javascript)
Comparación
| Tipo de método | Características principales | Marca sintáctica | Escenarios de uso |
|---|---|---|---|
| Método de instancia Instance | Accede a variables de instancia, cuerpo lógico completo | Definición de función normal | Comportamientos habituales del objeto (cálculos, operaciones de negocio) |
| Sobrecarga de operador Operator | Método de instancia con nombre especial, palabra clave operator | operator +() etc. | Suma, resta, indexación y comparación de igualdad personalizados para objetos |
| Getter/Setter | Lectura y escritura de propiedades; get sin parámetros, set con un parámetro | get / set | Encapsular propiedades calculadas, punto unificado de lectura/escritura externo |
| Método abstracto Abstract | Sin cuerpo de método, solo declaración de interfaz | Punto y coma ; tras la firma del método | Definir especificaciones en clase padre abstracta, obligar implementación en subclases |