2012-10-12 46 views
5

He aprendido que el uso de métodos virtuales proporciona un comportamiento predeterminado para un método/función. Mi consulta es que, cuando podemos implementar un método del mismo nombre (como en la clase base) usando "nuevo" en la clase derivada y podemos llamarlo por objetos por separado, entonces ¿cuál es el uso del método virtual? Por ejemplo;¿Está utilizando el método virtual solo la ventaja de la generación de instancia única?

class A 
{ 
     public void F() 
     { 
     //default behavior 
     } 

     public virtual void G() 
     { 
     //default behavior 
     } 
} 

class B:A 
{ 
    new public void F() 
    { 
     //new behavior from that of class A 
    } 
    public override void G() 
    { 
     //new behavior from that of class A 
    } 
} 

class Test 
{ 
    public static void Main(string[] args) 
    { 
     //For calling A's method use same compile time and run time object 
     A obj1 = new A(); 

     //For calling B's method use compile time object of A and run time of B 
     A obj2 = new B(); 

     obj1.F(); //O/P is A's method result 
     obj2.F(); //O/P is A's method result 
     obj1.G(); //O/P is A's method result 
     obj2.G(); //O/P is B's method result 
} 

Mi pregunta es por qué G virtual() en la clase A es necesaria cuando podemos proporcionar un comportamiento por defecto, así como comportamientos derivados mediante el uso de un mismo objeto en tiempo de compilación y ejecutar un objeto de tiempo de ambas clases A y B, así como:

A obj1 = new A(); //for calling A's methods 
B obj2 = new B(); //for calling B's methods 
A obj3 = new B(); //for having default behavior of class A using B's run time object. 

Lo fui a buscar sólo es que en caso de que acabamos virtuales no necesitan hacer un objeto más de la misma compilar y ejecutar el tipo de tiempo. Se puede lograr con un solo objeto que es el tiempo de compilación del tipo A y el tiempo de ejecución del tipo B.

Respuesta

6

Mi pregunta es por qué se necesita G() virtual en la clase A cuando podemos proporcionar un comportamiento predeterminado usando el mismo tiempo de compilación y ejecutar un objeto de tiempo y el comportamiento derivado mediante el uso de compilar tiempo objeto de A y tiempo de ejecución de B.

porque entonces se puede código sólo uso que ya se sabe acerca de B. La mitad del punto de polimorfismo es permitirle escribir código que no le importa con qué subclase funciona realmente.

Por ejemplo, puedo escribir un método para copiar el contenido de una secuencia a otra usando Stream.Read y Stream.Write precisamente porque son métodos virtuales o abstractos. No importa qué implementaciones se pasen.

Rara vez debería usar new como modificador de método; si realmente desea proporcionar un comportamiento diferente para un método no virtual, es mucho más claro si crea un método totalmente diferente nombre del método, de modo que cualquier persona que lea el código comprenda que este es un método muy diferente del declarado en la clase base.

+0

Tal vez mi mente no se soluciona con la respuesta ... No puedo entenderlo claramente. ¿Puedes darle un toque más realista? Sí, gracias por la pronta respuesta. – user1740176

+0

Me temo que no tengo idea de lo que quiere decir con "toque más realista". –

+0

Bueno, no lo dejen en claro. Estaba intentando preguntar eso: ¿el uso del método virtual solo ahorra memoria? ¿Para no crear más objetos o tiene otros motivos también? Por un toque realista, me refería a cualquier ejemplo de la vida real. – user1740176

0

Jon señala una razón, otra es que si oculta la implementación que es nueva, cualquier referencia al método en la clase base es a la implementación base, mientras que si anula cualquier invocación, incluso en la clase base utiliza el método

protected virtual void Foo(){ 
} 

private void Bar() { 
    //do generic stuff 
    Foo(); 
} 

Si una clase anula a foo, eso alterará el efecto de la barra de llamadas. Esta es la base de ciertos patrones de diseño como AbstractTemplate

+0

Gracias por su respuesta Rune. Disculpas, no pude obtener tu ejemplo. – user1740176

Cuestiones relacionadas