2011-01-12 12 views
5

Con esto quiero decir, es posible marcar un método virtual en C# como final, por lo que ningún otro tipo derivado de este tipo puede anularlo nunca más.¿Es posible finalizar un método virtual en C#?

+0

Por curiosidad, ¿cuál es su caso de uso? Esta es una característica bastante rara vez utilizada. ¿Cuál es el escenario que tiene donde tiene sentido sellar el * método * pero no la * clase *? –

+0

@Eric: En realidad, no tengo ningún caso de uso: O Pero lo que sucedió es esto. Estoy usando una biblioteca .NET de terceros que todavía no está disponible. Esta biblioteca tiene muchos tipos donde solo tienen constructores internos. Quiero hacer mis propios tipos derivados de estos, pero tal como están, no es posible porque los constructores deben ser públicos. Se lo pregunté, y me dijeron que los métodos virtuales pueden causar problemas difíciles de depurar, por lo que no pueden hacer esto. Recordaba vagamente una forma de "finalizar"/sellar los métodos virtuales, por eso pregunté esto y les dije que, si están interesados, pueden usar ... –

+0

la palabra clave sellada para sellar esos métodos virtuales. También les dijo que si la herencia no está destinada a su biblioteca, entonces los tipos deben ser sellados por su desempeño. Pero con estos tipos que tienen constructores internos, no es posible realmente hacer uso de ellos. ¿Qué piensas? ¿Crees que sus preocupaciones contra la herencia y los métodos virtuales son válidos? –

Respuesta

22

Sí: al anular un método, también puede declararlo sealed.

+2

Buena respuesta. Un punto de aclaración al OP; solo las anulaciones de los métodos virtuales (que también son virtuales) pueden sellarse; la declaración que tiene 'virtual' tampoco puede ser' sellada'. Es redundante; la palabra clave sellada "deshace" una palabra clave virtual o abstracta que hace que el método sea virtual en la clase base. Debe haber al menos un nivel de herencia entre virtualizar el método y sellarlo. – KeithS

+0

Gracias KeithS, ¿pueden dar un ejemplo de código para esto? No creo haberlo entendido –

+3

básicamente, 'anulación pública sellada anular MyMethod()' compila. 'void virtual sellado virtual MyMethod()' no, porque en el mismo nivel de herencia, está marcando el método como invalidable y no invalidable. Es redundante; 'public void MyMethod()' crearía un método no invalidable. Ese era el punto que estaba tratando de hacer; aunque los métodos virtuales pueden sellarse, en realidad deben ser reemplazos del método base que originalmente se marcó como virtual. – KeithS

Cuestiones relacionadas