2013-02-06 8 views
6

Non ho familiarità con la parola "sottotipo" dopo aver visto the wikipedia article.Quando la sostituzione di Liskov si riferisce ai sottotipi, si tratta di classi derivate nel contesto di C#?

ho preso la sostituzione Liskov a significare se si dispone di un metodo che prende un Animal, si dovrebbe essere in grado di passare in un Cat o un Animal dove Cat : Animal senza effetti collaterali indesiderati.

E 'questo a cui si riferisce la sostituzione di Liskov?

+5

Sì, fondamentalmente. Ovviamente di solito * ci saranno * differenze distinguibili, altrimenti non ci preoccuperemo di sottoclassi diverse, ma fintanto che tutti obbediscono al contratto dell'interfaccia/classe base, e tutto dipende dal client, dovrebbe funzionare. (Ho pensato che fosse troppo semplice da aggiungere come risposta.) –

+3

Perché votare per chiudere questa domanda come "non costruttivo"? – ken2k

+0

Grazie, non ero sicuro se si riferisse al modo in cui è possibile utilizzare tipi come int/double al posto uno dell'altro. Se lo metti nella casella di risposta, posso contrassegnarlo come risposta. – NibblyPig

risposta

3

Esattamente. Tutto ciò che prende un animale dovrebbe essere in grado di prendere un cane, un gatto e sottoclassi (razze, se vuoi). I metodi saranno compatibili.

Si noti inoltre che le condizioni preliminari non possono essere rafforzate in un sottotipo, né possono essere indebolite le post-condizioni. Altrimenti si potrebbe inserire uno specifico sottotipo e questo si spezzerebbe perché il codice circostante aveva imposto determinate precondizioni che la sottoclasse non poteva tollerare. Questo può essere difficile da implementare nella pratica - vedi the circle/ellipse problem per maggiori informazioni.

+0

+1 per pre e post-condizioni. Perché è di questo che si tratta quando parliamo di Liskov nel contesto di un linguaggio fortemente tipizzato. –

+0

Sembra interessante, leggerlo ora. Mi stavo chiedendo in che modo violi esattamente il principio, poiché essendo C# fortemente digitato non puoi accedere ad alcuna proprietà che non esiste per errore. – NibblyPig

+0

Quindi diresti che il Principio di Liskov è infranto in quella situazione perché un 'Cerchio' non è un tipo di 'Ellisse'? E questo è dimostrato dal fatto che 'stretchX' non è un'operazione valida su un' Circle'? – NibblyPig

0

Sì. Il principio di sostituzione di Likov afferma che se un modulo di programma utilizza una classe Base, il riferimento alla classe Base può essere sostituito con una classe derivata senza influire sulla funzionalità del modulo di programma.

Problemi correlati