Con ciò intendo, è possibile contrassegnare un metodo virtuale in C# come finale in modo che nessun altro tipo derivante da questo tipo possa sovrascriverlo mai più?È possibile finalizzare un metodo virtuale in C#?
risposta
Sì: quando si esegue l'override di un metodo, è possibile dichiararlo anche sealed
.
Buona risposta. Un punto di chiarimento per l'OP; solo gli override dei metodi virtuali (che sono anch'essi virtuali) possono essere sigillati; la dichiarazione che ha 'virtuale' non può essere anche' sealed'. È ridondante; la parola chiave chiusa "annulla" una parola chiave virtuale o astratta che ha reso il metodo virtuale nella classe base. Ci deve essere almeno un livello di ereditarietà tra rendere il metodo virtuale e sigillarlo. – KeithS
Grazie KeithS, puoi dare un esempio di codice a questo? Non penso di aver capito. –
fondamentalmente, 'public publicride sealed void MyMethod()' compila. 'public virtual sealed void MyMethod()' non lo fa, perché allo stesso livello di ereditarietà, si sta marcando il metodo come sovrascrivibile e non sovrascrivibile. È ridondante; 'public public MyMethod()' creerebbe un metodo non overridable. Questo era il punto che stavo cercando di fare; sebbene i metodi virtuali possano essere sigillati, in realtà devono essere sovrascritti dal metodo di base che è stato inizialmente contrassegnato come virtuale. – KeithS
È possibile utilizzare sealed.
Per curiosità, qual è il tuo caso d'uso? Questa è una caratteristica usata raramente. Qual è lo scenario che hai dove è opportuno sigillare il * metodo * ma non la * classe *? –
@Eric: In realtà non ho alcun caso d'uso: O Ma quello che è successo è questo. Sto usando una libreria .NET di terze parti che non è ancora disponibile. Questa libreria ha molti tipi in cui hanno solo costruttori interni. Voglio rendere i miei tipi derivati da questi, ma il modo in cui è, non è possibile perché i costruttori devono essere pubblici. Ho chiesto loro di farlo e hanno detto che i metodi virtuali possono causare problemi di debug, bug insidiosi, quindi non possono farlo. Ho vagamente ricordato un modo per "finalizzare"/sigillare i metodi virtuali, ecco perché ho chiesto questo, e ho detto loro che, se sono interessati, possono usare .. –
la parola chiave sigillata per sigillare quei metodi virtuali. Inoltre ha detto loro se l'eredità non è intesa per la loro biblioteca, quindi i tipi dovrebbero essere sigillati per la prestazione. Ma con questi tipi che hanno costruttori interni, non è possibile utilizzarli davvero. Cosa ne pensi? Pensi che le loro preoccupazioni contro l'ereditarietà e i metodi virtuali siano valide? –