Immagina di scrivere un gioco in cui i carri armati combattono tra loro.
Una classe generica Tank è creata e ha il metodo fire () che lancia un cannone, assomiglia a questo Tank::fire() { /* fires a cannon */ }
E poi c'è una classe per BossTank che fire () lancia un cannone e anche un missile.
Un anziano mi ha consigliato di fare qualcosa del tipo:
Tank::fire() { fireProjectile(); }
e crea una nuova funzione:
Tank::fireProjectile() { /* fire a cannon */ }
Quindi in BossTank
possiamo ereditare:
BossTank::fireProjectile() {
parent::fireProjectile();
/* fire a missile */
}
Non so perché, non mi sento bene per questo. Forse perché la riga parent::fire()
sembra incoerente con più linee elementari per /* fire a missile */
Un altro collega ha suggerito questo:
Tank::fire() { fireCannon(); }
e Tank::fireCannon() { /* fire a cannon */ }
Quindi BossTank::fire() { fireCannon(); fireMissile(); }
con BossTank::fireMissile { /* fire a missile */ }
(questo è un metodo solo in questa classe)
Mi piacerebbe seguire queste linee:
Tank::fire() { fireCannon(); fireAdditionalProjectiles(); }
con Tank::fireAdditionalProjectiles()
vuoto.
Quindi in BossTank
possiamo sovrascrivere fireAdditionalProjectiles()
per lanciare i missili.
Quindi ecco 3 modi per implementare la "stessa" cosa:
- Senior: Ereditarietà - estraendo cannoni antincendio quindi nessuna duplicazione.
- Collaboratore: Sostituisci
fire()
e implementa una nuova funzione solo in BossTank - Me: implementa la nuova funzione
fireCannon()
per nessuna duplicazione efireAdditionalProjectiles()
per l'override in BossTank
Questa è una preferenza personale o ci sono degli standard riguardo a questa situazione?