2009-03-07 34 views

Respuesta

30

El modificador Virtual se utiliza para marcar que un método \ property (ect) se puede modificar en una clase derivada mediante el modificador override.

Ejemplo:

class A 
{ 
    public virtual void Foo() 
     //DoStuff For A 
} 

class B : A 
{ 
    public override void Foo() 
    //DoStuff For B 

    //now call the base to do the stuff for A and B 
    //if required 
    base.Foo() 
} 
3

Con el fin de ser capaz de anularlo en heredar clases.

Consulte la MSDN entry para la palabra clave. Eso lo explica más en profundidad.

4

Los métodos virtuales son similares a los métodos abstractos en las clases base, excepto que su implementación en las clases derivadas es opcional. También podría poner la lógica en el método virtual y anular estos en las clases derivadas.

7

Virtual Methods on MSDN

La palabra reservada virtual se utiliza para modificar un método o propiedad de declaración, en cuyo caso el método o la propiedad se llama un miembro virtual. La implementación de un miembro virtual puede ser modificada por un miembro invalidado en una clase derivada.

Cuando se invoca un método virtual, se comprueba el tipo de tiempo de ejecución del objeto para un miembro invalidado. Se llama al miembro que reemplaza en la clase más derivada, que podría ser el miembro original , si ninguna clase derivada ha reemplazado al miembro. (Para obtener más información sobre el tipo de tiempo de ejecución y la mayoría aplicación derivados, véase 10.5.3 métodos virtuales.)

Por defecto, los métodos son no virtual. No puede anular un método no virtual .

No puede utilizar el modificador virtual con los siguientes modificadores:

estáticasabstractosanulación

propiedades virtuales se comportan como métodos abstractos, a excepción de los diferencias en la declaración y sintaxis de invocación

  • Es un error utilizar el modificador virtual en una propiedad estática.
  • Una propiedad virtual heredada puede ser anulada en una clase derivada por incluyendo una declaración de propiedad que usa el modificador de modificación.
2

Incluso si usted no va a derivar de la clase, marcando el método virtual puede ser necesario con el fin de burlarse de la clase. Algunos frameworks burlones solo le permiten simular métodos virtuales. Tenga en cuenta que los métodos que implementan una interfaz son virtuales implícitamente.

Uso RhinoMocks que tiene esta restricción y he decidido marcar mis métodos virtuales de forma predeterminada por este motivo. Para mí, esta es probablemente la razón más importante para usar métodos virtuales ya que los casos en que la herencia entra en juego son mucho menos frecuentes.

1

hace falta decir que los métodos virtuales son muy útiles cuando el código está tratando de cumplir con el Open Closed Principle

leer más sobre el Abierto Cerrado Principio here, documento técnico OCP original del tío Bob.

También tenga en cuenta que los métodos son no virtuales por defecto en C# a diferencia de Java.

4

Un método virtual es un tipo de método donde las llamadas al método real dependen del tipo de tiempo de ejecución del objeto subyacente.

Un método no virtual es un tipo de método donde el método real llamado depende del tipo de referencia del objeto en el punto de invocación del método.

25

Virtual permite que una clase heredante reemplace un método que utiliza la clase base.

public class Thingy 
{ 
    public virtual void StepA() 
    { 
     Console.Out.WriteLine("Zing"); 
    } 

    public void Action() 
    { 
     StepA(); 
     Console.Out.WriteLine("A Thingy in Action."); 
    } 
} 

public class Widget : Thingy 
{ 
    public override void StepA() 
    { 
     Console.Out.WriteLine("Wiggy"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Thingy thingy = new Thingy(); 
     Widget widget = new Widget(); 

     thingy.Action(); 
     widget.Action(); 

     Console.Out.WriteLine("Press any key to quit."); 
     Console.ReadKey(); 
    } 
} 

Al ejecutar el programa de su salida será:

Zing 
A Thingy in Action. 
Wiggy 
A Thingy in Action. 

Aviso cómo a pesar de widgets llamado el método de acción() definido en el nivel Thingy, internamente cosita llamado método de Widget stepa().

La respuesta básica es que da a los herederos de una clase más flexibilidad. Por supuesto, tienes que diseñar bien tu clase o podría causar estragos.

2

Una breve pregunta ... una respuesta corta! Califique su método como "virtual" si cree que heredará la clase a la que pertenece.

Un answser más largo: "virtual permite anular, a GIV e otro significado, de su método en una clase derivada

1

funciones virtuales son las funciones que en realidad no exists.The clase derivada puede modificar. la función virtual sobreescribiendo funciones it.Virtual son uno de la manera de lograr el tiempo de ejecución polimorfismo

public class sample { 
     public virtual void fun(){ 
     Console.WriteLine("base sample class \n"); 
     } 
    } 
    public class A : sample{ 
     public override void fun(){ 
     Console.WriteLine("Class A \n"); 
     } 
    } 
    public class B : sample{ 
     public override void fun(){ 
     Console.WriteLine("Class B \n"); 
     } 
    } 
    class run{ 
     public static void main(String[] args){ 
     sample obj = new sample(); 
     sample obj1 = new A(); 
     sample obj2 = new B(); 
     obj.fun(); 
     obj1.fun(); 
     obj2.fun(); 
     } 
    } 
+0

¿Qué quiere decir con "no existe en realidad"? ¿Podría proporcionar una referencia – Mubarek

+0

Esto no se parece a la herencia de C#. Los modificadores de acceso 'public' después de' clase A' y 'clase B' provocan errores de tiempo de compilación. La accesibilidad de los miembros en la clase base de la clase derivada se especifica de forma individual a partir de la clase base (por defecto los miembros son 'privados'). –

+0

@Minh Tran - Sí, tienes razón. Eso fue herencia de C++. De todos modos, edité la publicación. –

1

el tiempo de ejecución tiene lugar durante el tiempo de compilación.
Cuando declara un método como virtual, declararlo en clase derivada requiere que agregue un modificador override o new.
podemos ver que cuando TrySpeak. Al pasar el hijo y el padre, ambos llaman a Speak of father, mientras que TryScream, llamarían a cada método.
Para entender esto, hay algunas cosas que deberíamos saber, en una instancia de Child, Hay dos métodos Scream de clase Child o clase de padre. Podríamos llamar al Scream desde la clase Child o la clase Father. Porque el modificador Virtaul marca el método para que pueda ser anulado por la clase derivada, lo que significa que incluso el Scream se llama desde la clase padre, se sobrescribe, sería diferente si usa el nuevo modificador.

import system; 
class Father 
{ 
    Speak() 
    { 
     Console.Writeline("Father is speaking") 
    } 
    virtual Scream() 
    { 
     Console.Writeline("Father is screaming")  
    } 
} 
class Child: father 
{ 
    Speak() 
    { 
     Console.Writeline("Child is speaking") 
    } 
    override Scream() 
    { 
     Console.Writeline("Child is screaming") 
    } 
} 
class APP 
{ 
    public static void Main() 
    { 
     // We new two instances here 
     Father father = new Father(); 
     Child child = new Child();   
     // Here we call their scream or speak through TryScream or TrySpeak 
     TrySpeak(father); 
     TrySpeak(child); 
     //>>>"Father is speaking" 
     //>>>"Father is speaking" 
     TryScream(father); 
     TryScream(child); 
     //>>>"Father is screaming" 
     //>>>"Child is screaming" 
    } 
    // when your method take an Parameter who type is Father 
    // You can either pass in a Father instance or 
    // A instance of a derived Class from Father 
    // which could be Child 
    public static void TrySpeak(Father person) 
    { 
     person.Scream(); 
    } 
    public static void TryScream(Father person) 
    { 
     person.Speak(); 
    } 
} 
Cuestiones relacionadas