2012-10-01 25 views
21

Estoy trabajando en un tutorial 'Professional ASP.NET MVC 3' de J Galloway. En este tutorial, Jon nos muestra cómo construir la tienda de música MVC.C# - cuándo usar public int virtual, y cuándo usar public int

Estoy en la parte donde estamos creando clases de CS para modelar los datos usando primero el código EF.

I todos los ejemplos en el libro, public virtual int property {get; set; } se usan sin explicación. El término virtual está lleno EN TODAS PARTES.

En otra parte de la web, no he visto el término virtual usado con ningún tipo de concordancia de ningún tipo.

Podría alguien explicarme:

  1. El propósito del término 'virtual' en este contexto particular
  2. está utilizando 'virtual' es necesario?
  3. ¿Por qué algunas personas usan 'virtual' y otras no?
  4. ¿Por qué algunas personas solo usan 'virtual' cuando definen claves externas?
  5. ¿Cuál es el mejor uso de la práctica del término 'virtual'?

Muchas gracias de antemano

+0

posible duplicado de [funciones virtuales] (http://stackoverflow.com/questions/6520394/virtual-functions) y http://stackoverflow.com/questions/1062102/practical-usage-of-virtual -functions-in-c-sharp – dash

+0

¿No sabía que las funciones virtuales y las propiedades virtuales eran una y la misma cosa? – Gravy

+1

Es importante la palabra clave 'virtual' :-) Independientemente de si se trata de una función o una propiedad, si no se marca como virtual, a menos que un descendiente utilice la palabra clave' new', deben tomar la implementación tal como se define en el clase base Imagine que tiene una clase llamada persona, con una propiedad llamada "Nombre". Si no lo marcó como una propiedad virtual, todos los descendientes de la persona, de forma predeterminada, obtendrán esa propiedad como su nombre. Si lo hace virtual (o usa la nueva palabra clave), puede anular (o, en el caso de que sea nuevo, reemplazar) esa implementación con una más específica. – dash

Respuesta

10

Para entender verdaderamente el virtual palabra clave que se va a querer leer sobre Polymorphism in general:

polimorfismo se refiere a menudo como el tercer pilar de programación orientada a objetos, después de la encapsulación y la herencia. polimorfismo es una palabra griega que significa "muchos en forma de" y tiene dos aspectos distintos:

  1. En tiempo de ejecución, los objetos de una clase derivada puede ser tratado como objetos de una clase de base en lugares tales como parámetros del método y colecciones o matrices . Cuando esto ocurre, el tipo declarado del objeto ya no es idéntico a su tipo de tiempo de ejecución.

  2. clases base pueden definir y aplicar métodos virtuales, y derivado clases puede anular ellos, lo que significa que proporcionan su propio definición y ejecución. En tiempo de ejecución, cuando el código del cliente llama al método , el CLR busca el tipo de tiempo de ejecución del objeto e invoca el que sobrescribe el método virtual. Por lo tanto, en su código fuente puede llamar a un método en una clase base, y causar una versión de la clase derivada de el método que se ejecutará.

Una vez que entienda mejor estos conceptos es posible que pueda determinar si es o no el método que va a crear el libro tiene que ser virtual o no.

0

a partir de documentos

La palabra clave virtual se utiliza para modificar un método, una propiedad o indexador declaración evento, y permitir que se reemplaza en una clase derivada.

Así que si necesita ocultar la funcionalidad anterior y agregar una nueva, puede usarla virtual. Las diferentes aplicaciones necesitan requrementce diferencia según el desarrollo de nuevos módulos y la arquitectura ..

ver aquí http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

1

Ver virtual (C# Reference) . Agregar la palabra clave virtual permite anular la propiedad en las clases derivadas, lo cual es muy probable cuando se compilan las clases base generalizadas de una aplicación MVC.

4

Ok, el término virtual, básicamente significa "invalidable" (tiene una implementación básica), pero no es abstracto (es decir, no hay una implementación original).

La palabra clave 'virutal' es necesaria si DESEA que alguien anule su método o propiedad, en lugar de 'ocultarla'.

Por lo tanto, esto se aplica a la herencia y el polimorfismo. Una clase derivada puede anular un método virtual y hacer su propia implementación (o incluso llamar a la implementación base en ese método). Al anular, puede garantizar que su nuevo método se denominará polimórficamente, en lugar de la implementación básica.

Inversamente, usando la palabra clave 'nueva', puede 'ocultar' los miembros y métodos de datos. Esto le permitirá realizar su propia implementación también, pero NO ejecuta su nueva implementación de forma polimórfica, sino que utilizará la implementación de la clase base.

Virual Keyword

Versioning with the Override and New Keywords (C# Programming Guide)

0

asegura virtuales que heredaron las clases de los niños prevalecen sobre la clase de base mediante la aplicación de ellos a reemplazar la propiedad. Sin ella, la palabra clave virtual, un objeto secundario no puede anular la funcionalidad base.

4

El motivo por el que utiliza la palabra clave virtual en su modelo es habilitar Change Tracking proxies. Esto es algo específico de Entity Framework (edite: también NHibernate, y posiblemente cualquier otro orm gracias @danludwig), y le permite a EF administrar automáticamente las entidades que está mapeando en la base de datos.

De MSDN:

Cada propiedad que se asigna a una propiedad de un tipo de entidad en el modelo de datos debe tener no sellada (NotOverridable en Visual Basic), pública, y virtual (Overridable en Visual Basic) obtener y establecer accesos .

+0

También debe marcar propiedades como 'virtual' en NHibernate, por lo que técnicamente no es específico de EF. NHibernate también utiliza proxies dinámicos para la gestión de FK y los propósitos de carga de impagos/flojos. – danludwig

6

Podría alguien explicarme:

  1. El propósito del término 'virtual' en este contexto particular

    Otros usuarios aquí respondieron a esta bien con muy buenas referencias.

  2. ¿Es necesario utilizar 'virtual'?

    Depende. A veces es necesario, a veces es superfluo.

  3. ¿Por qué algunas personas usan 'virtual' y otras no?

    Lo usan cuando lo necesitan, o cuando creen que podrían necesitarlo.

  4. ¿Por qué algunas personas solo usan 'virtual' cuando definen claves externas?

    Cuando se definen claves foráneas para el uso de herramientas de mapeo relacional de objetos como Entity Framework y NHibernate, a menudo es necesario virtual porque estas herramientas ORM crean dinámicamente una nueva clase que hereda de su clase. Estas clases de "proxy dinámico" anulan sus propiedades virtual para proporcionar un comportamiento adicional necesario para mantener la coherencia de clave externa. En el caso de NHibernate, todas las propiedades (no solo las claves externas) se deben marcar virtual. Esto se debe a que los proxys dinámicos de NH agregan un comportamiento personalizado para decidir qué propiedades de su modelo recuperar de la base de datos y cuáles evitar para cargar.

  5. ¿Cuál es el uso de la mejor práctica del término "virtual"?

    Utilícelo cuando intente anular un miembro (método o propiedad) en una clase más derivada. No los use en las clases marcadas sealed.

Cuestiones relacionadas