However, as long as you trust that Liskov's Substitution Principle will be followed, then why would you not allow it to be overriden?
Ad esempio, perché voglio che venga fissata l'implementazione dello scheletro di un algoritmo e che solo le parti specifiche siano (ri) definite da sottoclassi. Questo è ampiamente noto come modello Metodo del modello (enfasi sotto di me):
The template method thus manages the larger picture of task semantics, and more refined implementation details of selection and sequence of methods. This larger picture calls abstract and non-abstract methods for the task at hand. The non-abstract methods are completely controlled by the template method but the abstract methods, implemented in subclasses, provide the pattern's expressive power and degree of freedom. Some or all of the abstract methods can be specialized in a subclass, allowing the writer of the subclass to provide particular behavior with minimal modifications to the larger semantics. The template method (which is non-abstract) remains unchanged in this pattern, ensuring that the subordinate non-abstract methods and abstract methods are called in the originally-intended sequence.
Aggiornamento
Alcuni esempi concreti di progetti su cui ho lavorato:
- comunicare con un sistema mainframe legacy tramite varie "schermate". Ogni schermata ha una serie di campi, di nome, posizione e lunghezza fissi, contenenti bit di dati specifici. Una richiesta riempie determinati campi con dati specifici. Una risposta restituisce i dati in uno o più altri campi. Ogni transazione segue la stessa logica di base, ma i dettagli sono diversi su ogni schermo. Abbiamo utilizzato il metodo Template in diversi progetti per implementare lo scheletro fisso della logica di gestione dello schermo, consentendo nel contempo alle sottoclassi di definire i dettagli specifici della schermata.
- esportazione / importazione dei dati di configurazione nelle tabelle DB per / da file Excel. Anche in questo caso, lo schema di base per l'elaborazione di un file Excel e l'inserimento / aggiornamento di record DB o il riversamento dei record su Excel sono gli stessi per ogni tabella, ma i dettagli di ogni tabella sono diversi. Quindi, il metodo Template è una scelta molto ovvia per eliminare le duplicazioni di codice e rendere il codice più facile da capire e mantenere.
- Generazione di documenti PDF. Ogni documento ha la stessa struttura, ma il loro contenuto è diverso ogni volta, a seconda di molti fattori. Anche in questo caso, Metodo Template semplifica la separazione dello scheletro fisso dell'algoritmo di generazione dai dettagli mutevoli e specifici del caso. Infatti. si applica anche su più livelli qui, in quanto il documento consiste di diverse sezioni , ognuna delle quali consiste di zero o più campi . Il metodo Template è applicato su 3 livelli distinti qui.
Nei primi due casi, l'implementazione legacy originale utilizzava Strategia , risultando in un sacco di codice duplicato, che ovviamente nel corso degli anni sono cresciute sottili differenze qua e là, contenevano molti bug duplicati o leggermente diversi ed era molto difficile da mantenere. Refactoring al metodo Template (e altri miglioramenti, come l'utilizzo delle annotazioni Java) ha ridotto le dimensioni del codice di circa il 40-70%.
Questi sono solo gli esempi più recenti che mi vengono in mente. Potrei citare più casi da quasi tutti i progetti a cui ho lavorato fino ad ora.