Sobrecarga vs sobrescritura
Dos palabras parecidas para dos ideas distintas: varios métodos con el mismo nombre y distintos parámetros, frente a una hija que sustituye el método de su padre.
✓ En esta sub-lección
- 01Escribir métodos sobrecargados y saber cómo elige Apex cuál ejecutar.
- 02Distinguir sobrecarga de sobrescritura por dónde viven y cuándo se decide.
- 03Evitar duplicar lógica haciendo que una sobrecarga llame a otra.
La nutria: ¿Te acuerdas? · Repaso de la lección 8
Si Discount es abstract, ¿se puede hacer new Discount()?
Sobrecargar y sobrescribir suenan casi igual y se confunden en entrevistas, en exámenes y hasta en libros. No se parecen en nada: una va de parámetros dentro de una misma clase; la otra, de herencia entre clases.
La nutria: El paralelo de Admin
Sobrecarga: mismo nombre, distintos parámetros
Una clase puede tener varios métodos con el mismo nombre si sus parámetros son distintos en número o en tipo. Apex elige cuál ejecutar mirando los argumentos que pasas, y lo decide al compilar. Ya lo has usado: String.valueOf(42) y String.valueOf(Date.today()) son métodos distintos con el mismo nombre, y también tus dos constructores de SupportPlan.
public class MoneyFormatter {
public static String format(Decimal amount) {
return format(amount, 'EUR'); // reutiliza la otra versión
}
public static String format(Decimal amount, String currencyCode) {
return currencyCode + ' ' + amount;
}
}
MoneyFormatter.format(1500); // EUR 1500
MoneyFormatter.format(1500, 'USD'); // USD 1500Sobrescritura: la hija lo hace a su manera
Es lo que hiciste en la lección anterior: el padre ofrece un método virtual o abstract y la hija escribe el mismo método, con los mismos parámetros, marcado override. Aquí la decisión se toma al ejecutar: aunque la variable sea de tipo padre, se ejecuta la versión del objeto real.
format(Decimal amount)return format(amount, 'EUR');format(Decimal amount, String currencyCode)return currencyCode + ' ' + amount;Con un solo argumento, Apex elige la versión de un parámetro, que a su vez llama a la de dos con 'EUR'. Resultado: 'EUR 1500'. Versiones una AL LADO de otra, en la misma clase.
| Sobrecarga | Sobrescritura | |
|---|---|---|
| ¿Dónde? | En la misma clase | Entre padre e hija |
| Parámetros | Distintos | Idénticos |
| Palabras clave | Ninguna | virtual/abstract + override |
| ¿Cuándo se decide cuál se ejecuta? | Al compilar, por los argumentos | Al ejecutar, por el objeto real |
Sobrecarga en la plataforma: ya la usabas
Sin saberlo, llevas todo el curso llamando a métodos sobrecargados. String.valueOf() acepta un Integer, un Decimal, una Date…: el mismo nombre con versiones para cada tipo. Y en el Módulo 4 usaste Database.insert(records) y también Database.insert(records, false): dos versiones del mismo método, una con el parámetro allOrNone y otra sin él. La plataforma decide cuál ejecutar por lo que le pasas, igual que tus propias clases.
La nutria: TEXT() en una fórmula es sobrecarga