Perché dobbiamo usare sigillato in una classe? Abbiamo veramente bisogno di essere sigillati?

6

Leggendo questo articolo (di Eric Lippert ), ha quattro argomenti sul motivo per cui dovresti usare sealed , tuttavia, non capisco perché in realtà abbiamo bisogno di . Ragioni filosofiche / estetiche a parte, perché abbiamo bisogno di usare sigillato?

Riesco a vedere come cose come readonly da C # o const da C ++ possano effettivamente rilevare errori reali. C'è qualche tipo di errore che sealed può intercettare?

Un motivo spesso citato per sigillare una classe è perché, non è stato progettato per essere esteso. Cosa significa? Perché è importante? Ci sono dei veri esempi di questo?

Il punto sulla compatibilità non è un motivo per cui abbiamo bisogno di sigillare le classi, ma perché dovrebbe essere l'impostazione predefinita.

Il punto finale è ancora strano, perché sigillare la tua classe non impedisce a qualcuno di fornire un'implementazione alternativa in un heirachy.

Modifica:

Se non ho messo abbastanza enfasi, su di esso sto già cercando dei motivi per cui abbiamo bisogno di esso. Non è il solito, "qualcun altro potrebbe scrivere codice cattivo". Comprendo che molte persone come utilizzano sealed per l'intento progettuale, ma sto cercando uno scopo pratico oltre a quello.

    
posta Dave Hillier 09.01.2014 - 21:55
fonte

2 risposte

4

What does that mean?

Significa che è difficile per le persone obbedire al Principio di sostituzione di Liskov (o meno probabilmente, il principio di Open Closed) con la classe così com'è. Ha un comportamento sottile o difficile da far rispettare che gli eredi potrebbero rovinare. Oppure non sono suscettibili di rovinare, ma l'impatto di avvitarli è enorme .

The final point again is strange, because sealing your class doesn't prevent someone providing an alternative implementation.

Certo che lo fa. Se qualche metodo accetta l'oggetto A o qualche altra classe usa il tipo A , avendo A sealed, le persone non possono sovrascriverlo con B e quindi passare B nel metodo o usarlo nella classe. I consumatori di A possono vedere che è sigillato e sapere che A è l'unico comportamento che stanno ottenendo.

Tutto ciò detto, non abbiamo bisogno di sealed - proprio come non abbiamo bisogno di readonly . Sono strumenti per aiutare i programmatori a prevenire l'uso improprio, perché l'uso improprio porta a bug. Sebbene personalmente, non mi piace sealed ; anche in questi giorni in cui la composizione sull'ereditarietà è ben nota, è raro che tu possa dire "nessuno avrà mai bisogno di estenderlo" ed effettivamente avere ragione.

    
risposta data 09.01.2014 - 22:05
fonte
2

Leggendo in giro ho trovato alcune cose, un po 'meno astratte delle violazioni LSP (anche se potrebbero essere considerate come):

  • Un tipo immutabile che è sottoclassificato può diventare mutabile (non adatto per il multi-threading, ecc.)
  • Uguaglianza poliforfa, puoi quindi garantire che i tipi sono uguali e non solo equivalenti.

Le classi di sigillatura offrono anche alcuni miglioramenti delle prestazioni di Runtime / Reflection

    
risposta data 10.01.2014 - 11:26
fonte

Leggi altre domande sui tag