precondizione effettivo di un sottotipo è creato combinando (utilizzando logico OR
) precondizioni di un tipo di base e precondizioni di un sottotipo, il che rende il presupposto risultantemeno restrittivoNon può indebolire precondizioni e rafforzando postcondizioni violano anche Liskov principio di sostituzione?
Actual postcondition di un sottotipo viene creato combinando (utilizzando logico AND
) postcondizioni di un tipo di base e post-condizione s di un sottotipo, il che rende la postcondizione risultantepiù restrittive
I seguenti sono esempi di rafforzare precondizioni e indebolimento postcondizioni, che di conseguenza violano LSP (Link):
Supponi che la tua classe base funzioni con un membro int. Ora il tuo sottotipo richiede che int sia positivo. Questo è rafforzata precondizioni, e ora qualsiasi codice che funzionava perfettamente benissimo prima con interi negativi è rotto.
Analogamente, assumere lo stesso scenario, ma la classe di base utilizzato per garantire che l'elemento sia positivo dopo essere stato chiamato. Quindi il sottotipo cambia il comportamento per consentire valori negativi. Il codice che opere sull'oggetto (e presuppone che il post-condizione è una positiva int) è ora rotto dal momento che la post-condizione non è accolto.
a) Perché non è anche considerata una violazione LSP quando metodo sostituito indebolisce precondizione, dal momento che questo metodo potrebbe utilizzare parametri che non sono accettabili per la contratti della base digitare. In quanto tale, non potremmo affermare che contratto del tipo di base è stata violata e di conseguenza LSP è stato inoltre violato?
b) Perché non viene anche considerata una violazione di LSP quando il metodo override rafforza la postcondizione, dal momento che i clienti che invocano questo metodo riceverà solo un sottoinsieme di possibili risultati del metodo originale. In quanto tale, non potremmo affermare che contratto del tipo di base è stata violata e di conseguenza LSP è stato inoltre violato?
Esempio:
Base classe postcondizione garanzie che il valore ritorno di un metodo sarebbe alla portata 1-10
, ma poi il sottotipo cambia il postcondizione per consentire solo valore ritorno a essere all'interno dell'intervallo 2-9
. Ora il codice che funziona sull'oggetto restituito da questo metodo (e presuppone che la postcondizione sia compresa nell'intervallo 1-10
) sia interrotta poiché la postcondizione non viene confermata.
Non ha senso confrontare il comportamento della classe base rispetto alla sottoclasse se si sta violando il contratto (1-100) della classe base in primo luogo. LSP si applica solo all'interno delle specifiche della classe base. Fuori specifica è un comportamento sconosciuto. – keyoxy