Herencia
Una clase hija recibe todo lo de su clase padre y añade lo suyo. En Apex, además, el padre tiene que dar permiso para ser heredado.
✓ En esta sub-lección
- 01Crear una clase hija con extends a partir de una clase padre marcada virtual.
- 02Llamar al constructor del padre con super(…) y usar protected para compartir con las hijas.
- 03Reconocer cuándo la relación «es un» justifica heredar.
La nutria: ¿Te acuerdas? · Repaso de la lección 6
Una propiedad public Decimal spent { get; private set; }, ¿quién puede cambiarla?
Imagina que tienes una clase Notification con destinatario, asunto y un método para previsualizarla. Ahora necesitas recordatorios de tareas: son notificaciones, pero con fecha de vencimiento. Copiar la clase entera y añadir un campo funcionaría… hasta que alguien arregle un fallo en una copia y no en la otra. La herencia evita esa copia.
La nutria: El paralelo de Admin
Padre e hija
public virtual class Notification {
protected String recipient;
public String subject;
public Notification(String recipient, String subject) {
this.recipient = recipient;
this.subject = subject;
}
public String preview() {
return subject + ' → ' + recipient;
}
}
public class TaskReminder extends Notification {
public Date dueDate;
public TaskReminder(String recipient, String subject, Date dueDate) {
super(recipient, subject); // el padre rellena lo suyo
this.dueDate = dueDate; // la hija, lo suyo
}
public Boolean isOverdue() {
return dueDate < Date.today();
}
}- extends Notification: TaskReminder hereda recipient, subject y preview() sin volver a escribirlos.
- virtual en el padre: en Apex, una clase no se puede heredar a menos que lo permita. Sin virtual, extends Notification no compila.
- super(…) llama al constructor del padre y tiene que ir en la primera línea, igual que this(…).
- protected: recipient es invisible para el resto de la org, pero TaskReminder sí puede usarlo. Es el nivel de acceso «solo para la familia».
recipient (protected)heredado de Notificationsubjectheredado de Notificationpreview()heredado de NotificationdueDatepropio de TaskReminderisOverdue()propio de TaskReminder
reminder.preview() → 'Llamar a Acme → ana@acme.com'TaskReminder tiene todo lo de Notification —sin volver a escribirlo— y además lo suyo. Como un perfil base con un permission set encima (simplificación: en Apex solo se hereda de una clase).
Usar la hija
TaskReminder reminder = new TaskReminder('ana@acme.com', 'Llamar a Acme', Date.today().addDays(-1));
System.debug(reminder.preview()); // heredado: Llamar a Acme → ana@acme.com
System.debug(reminder.isOverdue()); // propio: true
Notification anyNotice = reminder; // una TaskReminder ES una NotificationLo que se hereda y lo que no
La hija recibe los atributos y métodos públicos y protected del padre. Lo private del padre sigue existiendo dentro del objeto, pero la hija no puede tocarlo: por eso recipient es protected, para que TaskReminder pueda usarlo. Y hay algo que NO se hereda nunca: los constructores. Si el padre solo tiene un constructor con parámetros, la hija tiene que escribir el suyo y llamar al del padre con super(…) como primera línea. Es la forma de decir «primero construye la parte de notificación, y luego yo añado lo mío».
public class TaskReminder extends Notification {
private Date dueDate;
public TaskReminder(String recipient, String subject, Date dueDate) {
super(recipient, subject); // 1º: el padre monta su parte
this.dueDate = dueDate; // 2º: la hija añade la suya
}
}La nutria: Un perfil base y lo que se añade encima