Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Virtuales?
0. Introducción
1. Contexto
2. Palabras Clave: abstract, y virtual
2.1 abstract
2.2 virtual
3. Resumen de diferencias
4. Recursos
5. Conclusiones
6. Glosario
7. Literatura & Enlaces
En esta ocasión estudiaremos los detalles que diferencian un miembro de tipo virtual y abstracto. Se hace
necesario tratar con dos de las palabras claves del lenguaje de programación C#: abstract, y virtual, para
comprender las diferencias. Veremos, además, cómo estas dos construcciones permiten crear una jerarquía de
herencia consistente a nuestro modelo del mundo del problema.
Continuando, cuando nos referimos a la omisión total del cuerpo de implementación de un método estamos
hablando de métodos abstractos. Este tipo de métodos son declarados en la implementación de una clase
abstracta y deben implementarse en el tipo derivado; en caso de no ser así el compilador lanzará un error
informando sobre el no cumplimiento del contrato de herencia entre una clase abstracta y una clase concreta.
Por otro lado, como veremos más adelante en ejemplos de uso, un método marcado como virtual puede o
no contener una implementación particular en un tipo derivado.
Para no extendernos más en este contexto, sugiero la lectura de estos dos artículos que nos ilustran más
acerca de clases y miembros abstractos, y miembros función virtuales:
2.1 abstract
Una clase puede ser marcada con el modificador abstract [4] para ser tratada como una clase abstracta; esto
quiere decir que sus miembros, en particular los métodos, también marcados como abstract carecen de una
implementación particular (abstracta). Veamos un ejemplo partiendo de la siguiente jerarquía de herencia:
En esta jerarquía de herencia la clase abstracta Calculadora puede contener el método abstracto llamado
Sumar. Este método debe ser implementado por las clases derivadas:
CalculadoraEstandar, y
CalculadoraTrigonometrica
Una versión de ejemplo de la clase Calculadora sería:
// Resto de la implementación...
}
Ahora, cualquiera de las dos clases concretas que herede de esta clase deben crear una implementación
concreta para el método abstracto Sumar. Veamos:
// Resto de la implementación...
}
2.2 virtual
La palabra clave virtual [5] se usa como modificador de un miembro de un tipo para especificar que puede
ser sobreescrito en cualquier tipo derivado (subclase). Su sobreescritura es opcional y puede pertenecer tanto
a una clase concreta como una clase abstracta (esta es una de las principales diferencias frente abstract).
Ahora vemos un ejemplo de uso en donde nos puede resultar útil este modificador. Enfoquémonos en la
jerarquía de herencia Figura:
Esta es la implementación base para cualquiera de las clases derivadas Circulo, Esfera, y Cilindro. Sin
embargo, cada una de estas clases puede optar por sobreescribir el método Area para el cálculo del área
según la dimensión; por ejemplo:
Notemos como la clase Esfera sobreescribe el método Area especificando su propia implementación. Esto se
logra con el modificador override.
Finalmente, vale aclarar que la sobreescritura en las clases derivadas es totalmente opcional.
Funciones abstractas:
Declaración únicamente dentro de clases abstractas.
Sólo se puede incluir la definición de la firma del método, y no su implementación.
Debe ser sobreescrita por cualquiera de las clases derivadas a partir de la clase base abstracta.
Funciones virtuales:
Puede ser declarada tanto en una clase abstracta como en una clase concreta.
El método puede contener u omitir la implementación en la clase base donde es declarado.
La sobreescritura es opcional por cualquier tipo derivado en una jerarquía de herencia.
Este es el vídeo en donde el equipo de expertos (Gerry O'Brein [https://twitter.com/gerryob] y Paul Pardi
[https://twitter.com/billp365] ) de MVA responden y explican esta pregunta:
Hemos comprendido las diferencias esenciales entre las funciones (métodos en particular) abstractas y
virtuales. En el primer caso podemos concluir que un método abstracto aparece en una clase abstracta, no
debe contener implementación, y debe ser sobreescrito por una clase concreta que herede de la clase
abstracta. En el caso de un método virtual, puede ser miembro tanto de una clase abstracta como de una
clase concreta, una clase derivada puede (opcional) sobreescribir la implementación del método de la clase
base. En la próxima pregunta C# comprenderemos la diferencia entre las palabras clave ref y out.
Clase abstracta
Clase concreta
Herencia
Polimorfismo
Subclase