domingo, 29 de diciembre de 2013

Miembros Función Virtuales en C#

Tabla de Contenido

0. Introducción
1. Miembros Función Virtuales
2. Construcciones para Miembros Función Virtuales
2.1 virtual
2.2 override
2.3 Ejemplo
2.4 new
2.5 Invocación de Métodos Virtuales desde Constructores
3. Conclusiones
4. Glosario
5. Literatura & Literatura

0. Introducción

En esta oportunidad voy a centrar mi atención en un tema muy interesante a la hora de implementar el mecanismo de polimorfismo en nuestro modelo del mundo del problema. Vamos a hacer un recorrido por los elementos fundamentales de los miembros función virtuales, en especial, los métodos virtuales y su capacidad especial para facilitar el mecanismo anteriormente nombrado. Desde luego las demostraciones en código fuente C# estarán centradas en el uso de las construcciones virtual y override.

1. Miembros Función Virtuales

Cuando de miembro función virtual hablamos, nos estamos referiendo a métodos, indezadores, propiedades, eventos, que, digamos, pueden mutar (cambiar su implementación) en tipos de datos dervidados en una jerarquía de herencia. Pensemos en esto como dicen en [3;Ans/b: BFee]:
~"...con un método virtual se crea la oportunidad de crear una implementación propia sobre los tipos de datos derivados. Lo anterior resulta opcional: puede dejar la implementación por defecto de la superclase, o hacer una implementación arbitraría para cada subtipo de la jerarquía de herencia."
[Nota: con el símbolo '~´ (tilde, o aproximación en ciencias matemáticas) en el parráfo anterior estoy significando una traducción e interpretación aproximada a la del autor original].

Hasta aquí he hecho una mera introducción respecto a métodos; sin embargo, el tratamiento o concepto es análogo para los demás tipos de función (i.e.: indezadores, eventos, y propiedades).

2. Construcciones para Miembros de Función Virtuales

Llega el turno de tratar las construcciones léxicas de C# para lograr la creación y la sobreescritura de miembros de función virtuales. Son dos:
  • virtual
  • override

2.1 virtual

virtual [6] es la construcción (modificador, precisamente) del lenguaje C# para especificar que un método, propiedad, evento o indezador es virtual. Este es un ejemplo en código fuente del método virtual Area (más adelante veremos una implementación completa):

public virtual double Area ()
{
return x * y;
}

Este método podrá ser sobrescrito (overriden) en cualquier clase derivada y especificar la implementación arbitraria al tipo de dato derivado.

Pero en abstracto, ¿qué quiere decir que un miembro función sea virtual? Un método virtual, por ejemplo, será invocado dependiendo del contexto en tiempo de ejecución del tipo de dato; esto quiere decir, que cuando el programa entrá en ejecución, la CLR es capaz de determinar la versión sobrescrita del tipo de dato derivado, de lo contrario sólo ejecutará la versión del método original (perteneciente a la superclase, o clase base).

Conectado con lo anterior, estamos implícitamente hablando de polimorfismo. Véamos esta jerarquía de herencia:
Jerarquía de herencia Figura
Figura 1. Jerarquía de herencia de figura (versión simplificada).
Podemos empezar a asumir que la clase Figura posee la versión de implementación del método Area presentanda al inicio de esta sección; en cuanto a las demás clases (i.e.: Circulo, Esfera, y Cilindro) poseerán una versión sobreescrita (arbitraria) del método en cuestión para cálculos específicos al tipo de figura.

Respecto al uso de este modificador, están los siguientes puntos a tener en cuenta [5]:
  • Por convención, los miembros de clase no son virtuales. Por consiguiente, no es posible sobreescribir métodos no virtuales. El compilador de C# generá el error CS0506:

    error CS0506: `NombreTipo.NombreMetodo()': cannot override inherited member `NombreTipo.NombreMetodo()' because it is not marked virtual, abstract or override
  • El modificador virtual no puede usarse en declaraciones de miembros con otros modificadores como static, abstract u override.
  • La invocación de miembros de la superclase se puede realizar usando la construcción base. Por ejemplo:

    base.MiembroDeSuperTipo;

2.2 override

Con la construcción override [6] se modifica la implementación de un miembro (e.gr.: un método) en las clases derivadas de una jerarquía de herencia. Por otro lado, este modificador es obligatorio para implementar un método heredado del contrato de una superclase abstracta.

Si tenemos en cuenta la jerarquía de herencia de la Figura 1, las clases CirculoEsfera, y Cilindro podrían sobreescribir el método Area de la siguiente manera:

public override double Area ()
{
// implementación arbitraria a cada tipo de dato heredado
}

Con la especificación de override en el método heredado, estamos especificando la sobreescritura del método Area con la implementación subjetiva del tipo de dato en cuestión.

2.3 Ejemplo

A continuación la implementación de la jerarquía de herencia de la Figura 1 en código fuente C#:

Archivo PruebaHerenciaFigura.cs:


En las líneas 32-35, por ejemplo, se hace la implementación requerida para calcular el área de un círculo:
http://latex.codecogs.com/png.latex?\large&space;A&space;=&space;\pi&space;r^{2}

2.4 new

Vale introducir el modificador new [8] para comprender el mecanismo de ocultamiento de miembros heredados. Por ejemplo:

Archivo PruebaOcultamiento.cs:

2.5 Invocación de Métodos Virtuales desde Constructures

En [1] nos advierten acerca del riesgo de invocar métodos virtuales desde constructures:
Peligro invocación métodos virtuales desde constructores.
Figura 2. Riesgo invocación métodos virtuales desde constructores [1].

3. Conclusiones

Hemos aprendido a escribir métodos virtuales (teniendo en cuenta que la lógica abstracta de virtualidad aplica para los demás tipos de función) y sobreescribirlos para implementaciones arbitrarias sobre tipos de datos derivados. Observamos en el ejemplo (2.3) cómo alcanzar polimorfismo usando las construcciones descritas en 2.1 y 2.2. Vimos además cómo ocultar miembros de superclases a través del uso de new (como modificador).

4. Glosario

- Overriden
- Polimorfismo
- Sobreescritura
- Virtual

5. Enlaces & Literatura

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: C# Virtual Method - http://www.dotnetperls.com/virtual
[3]: c# - What is the difference between an abstract function and a virtual function? - Stack Overflow - http://stackoverflow.com/questions/391483/what-is-the-difference-between-an-abstract-function-and-a-virtual-function
[4]: 10.5.3 Virtual methods (C#) - http://msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx


H

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.