2011-12-03 9 views
5

Aquí está el panorama¿Opina sobre un método que anula y se anula al mismo tiempo en C#?

 public class Connection 
    { 
     public virtual void close() 
     { 
      /*Some code */ 
     } 
    } 

    public interface IHttpRelay 
    { 

     void close(); 

    } 

    public class HttpConnection: Connection,IHttpRelay 
    { 
     public /*keyword*/ void close() 
     { 
      base.close(); 
     } 
    } 

    public class Http:HttpConnection 
    { 
     public override void close() 
     { 
      /*Some code */ 
     } 
    } 

Mi pregunta es saber si debo declarar el método close() en HttpConnection clase con una anulación o virtuales palabra clave, ya que anula y se anula al mismo tiempo.

Respuesta

2

Necesitas marcarlo con override. Si marca con virtual en HttpConnection, se ocultar la implementación de la clase base, que no anula. Como resultado, no se podría usar polimórficamente. Marque un método virtual, el resto simplemente debe ser anulado.

Como un ejemplo sencillo

class A 
{ 
    public virtual void Frob() 
    { 
     Console.WriteLine("A"); 
    } 
} 

class B : A 
{ 
    public virtual void Frob() 
    { 
     Console.WriteLine("B"); 
    } 
} 

class C : B 
{ 
    public override void Frob() 
    { 
     Console.WriteLine("C"); 
    } 
} 

Aquí, B redefine una FROB virtual, que no anula. Sigue tu ejemplo. Sin embargo, cuando se trabaja con una instancia de C a través de la referencia de A, ocurre algo "inesperado".

A obj = new C(); 
obj.Frob(); // "A" is written to the screen, not "C" 

Lo que se escribe en la pantalla es "A", no se obtuvo el comportamiento polimórfico que cabría esperar. Cuando oculta un miembro en lugar de anularlo, solo obtiene el nuevo comportamiento a través de la referencia de la clase oculta. Cuando se hace referencia a través de una clase base, ¡usted recibe los comportamientos básicos! Normalmente, esto no es lo que desea en un escenario polimórfico virtual/anular. Si reemplaza el virtual con override en la clase B y luego ejecuta el fragmento anterior, el resultado es el que usted esperaría.

1

tienes que declarar que override solamente. Los documentation para virtual estados:

No se puede utilizar el modificador virtual con los static, abstract, private, o override modificadores.

Si se piensa en ello, virtual override no tiene sentido: si no otra cosa que no se puede saber si alguien anulará su anulación en el futuro, y sin duda el autor de una clase no puede volver atrás y añadir la virtual modificador a un método después de decidir anularlo.

+0

Cualquier método que anula ya debe ser virtual, por lo que sería confuso si el lenguaje permite que usted agregue el modificador 'virtual' a él una vez más. – Joren

2

modificador La anulación no impide que las clases derivadas para anular el mismo método una vez más. Para evitar esto, también debe usar el modificador sealed.

Cuestiones relacionadas