2010-10-01 19 views

Respuesta

48

Si un método no es virtual (o abstracto), no puede ser anulado en la subclase. La única opción es usar la palabra clave new para ocultar el método heredado, pero generalmente no es una práctica recomendada, ya que al convertir la instancia de la subclase a la clase principal y al invocar el método, se llamará al método de clase padre en su lugar, y esa probablemente no sea la funcionalidad prevista.

En resumen, sí, debe ser virtual para anular, pero no lo haga tiene para anularlo. Si no lo hace, se llamará a la versión de la clase base en su lugar. Pero si lo sobrescribe, incluso si le asigna el objeto al tipo de clase base, se llamará a la versión derivada del método, a diferencia de ocultar el método con new.

Es bueno saber la diferencia entre anular y ocultar el método, ya que a primera vista, y si lo prueba, puede parecer que hace lo mismo, pero volverá a morder más adelante cuando el programa don No funcionan como se esperaba, y no tienes idea de por qué.

+1

señor ¿puede por favor elaborar sobre esto también sobreescribir vs ocultar el método – NoviceToDotNet

+0

también es necesario poner la palabra clave virtual antes de anularla, sin esto no funciona? – NoviceToDotNet

+0

¿Qué aspecto le gustaría obtener elaborado? La diferencia entre virtual/override y new? –

7

Sí, si un método no está marcado como virtual o abstracto, no puede anularse. La única excepción es cuando declaras un método de interfaz que no necesitas usar porque un método de interfaz es virtual por definición. Cuando implemente esta interfaz, debe usar virtual o abstracta si desea derivar de la clase que implementa la interfaz y poder anular el método.

3

No es obligatorio anular los métodos virtuales que no son abstractos.

Es obligatorio implementar métodos abstractos a menos que también marque el resumen de su clase.

10

No. puede ser anulado por una subclase, pero no tienen ser.

Si desea aplicar primordial por las subclases, utilice abstract en una clase de abstract, o utilizar una interfaz (lo que significa que tiene poner en práctica todos los miembros declarados).

+2

Tenga en cuenta que para marcar el método como abstracto, también debe marcar la clase como abstracta, de modo que si desea crear los objetivos de la clase principal así como las clases derivadas, no puede aplicar las subclases para anular el método. Una interfaz de otra manera para asegurarse de que una clase implementa un conjunto específico de métodos. –

2

sí para anular la necesidad de escribir una palabra clave virtual. o escribir el método abstracto de palabra clave.

2

No, solo significa que puede anularlo, no es necesario. Resumen es la palabra clave si desea que sea obligatorio para la subclase implementarlo.

3

No, no es obligatorio anular un método virtual en una clase derivada.

16

No, cuando utiliza la palabra clave "virtual", depende de usted si desea anularla o no. Cuando usa "abstract", necesita anular el método en la clase derivada.Para obtener más información, consulte:

+5

Solo se requiere * que anule el método abstracto en una clase derivada si la clase derivada es una clase * no abstracta * derivada de una clase base absract. –

9

es un método virtual es obligatoria para anular por su clase secundaria?

¿Puedo reemplazar un método que no es virtual en la clase padre?

¿Cuál es sí, entonces?

Debe implementar el método abstracto de la clase padre (si la clase derivada es no abstracta)

puedo escribir la palabra clave virtual en el método estático

NO, porque estos dos son solo palabras opuestas. Virtual significa que el compilador no sabe en tiempo de compilación a qué método llamar. Estático significa, sin duda, que su compilador sabe qué método se llamará.

¿Cómo puedo detener las subclases de mi clase actual a no Reemplazar a mi método?

Marcarlo con la palabra clave sealed.

¿El método abstracto es virtual también?

YES. Es por eso que tampoco podemos marcar explícitamente el método abstracto virtual.

¿Anular y sobrecargar lo mismo?

Fuera de curso no! La sobrecarga es tener 2 métodos con el mismo nombre pero que funciona en diferentes conjuntos de parámetros de entrada.

¿Cuándo debo marcar un método como Virtual?

Cuando usa polimorfismo y no está seguro del tipo de objeto que pasa a su método hasta el tiempo de ejecución, y desea que sus subclases tengan un comportamiento diferente, marque el método como Virtual. p.Usted tiene

class Law 
{ 
public void Punish(Minister any) 
{ 
    if (any.Corruption() == true) 
     { 
     ... do whatever public wants... 
     } 
} 
} 

Y tiene jerarquía de clases Ministro -Ministers, CentralGOVTMinisters, StateGOVTMinisters, DistrictAuthorityMinisters etc. Y usted sabe que todo lo que se define en la clase Ministro de la Corrupción() método puede ser utilizado por muchos clase derivada, pero para unos pocos ministros Las leyes de corrupción son diferentes (¡tienen poderes supremos!), por lo que anulas la Corrupción() y en todas partes tus clases derivadas usan la implementación de Corrupción() en la clase de Ministro (base de todo ministro).

Cuestiones relacionadas