Apex Academy
Módulo 5·09·18 min

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 Admin es«Nuevo contacto» desde la cuenta o desde la pestaña (sobrecarga) · un layout por Record Type (sobrescritura)

✓ En esta sub-lección

  1. 01Escribir métodos sobrecargados y saber cómo elige Apex cuál ejecutar.
  2. 02Distinguir sobrecarga de sobrescritura por dónde viven y cuándo se decide.
  3. 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

Así los distinguí yo: «Nuevo contacto» existe desde la pestaña Contactos (llegas sin datos) y desde la related list de una cuenta (llegas con la cuenta ya puesta): la misma acción, distintas entradas. Eso es sobrecarga. En cambio, cuando un Record Type sustituye el page layout por defecto por uno propio, el registro «hace lo mismo a su manera». Eso es sobrescritura.

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.

Apex
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 1500
La versión corta llama a la larga con un valor por defecto: la lógica vive en un único sitio, como con this(…) en los constructores.

Sobrescritura: 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: varias versiones una al lado de otra, en la misma clase. Sobrescritura: una versión encima de otra, en la jerarquía.
SobrecargaSobrescritura
¿Dónde?En la misma claseEntre padre e hija
ParámetrosDistintosIdénticos
Palabras claveNingunavirtual/abstract + override
¿Cuándo se decide cuál se ejecuta?Al compilar, por los argumentosAl 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

Tú ya usas sobrecarga, como yo la usaba sin saberlo: en un campo fórmula escribes TEXT(Amount), TEXT(CloseDate) o TEXT(StageName), y la misma función sabe convertir un número, una fecha o un picklist. No hay una TEXTFROMDATE ni una TEXTFROMPICKLIST: hay un solo nombre que se adapta a lo que recibe. Eso es sobrecarga. La sobrescritura, en cambio, sería que cada Record Type tuviera su propia versión de una misma regla: mismo nombre, mismo uso, distinto comportamiento según quién es.