sábado, 7 de diciembre de 2013

Herencia en C#

Tabla de Contenido

0. Introducción
1. Herencia en C#
1.1 Métodos Abstractos y Virtuales
1.2 Clases Base Abstractas
1.3 Interfaces
2. Sistema de Extractos, Certificados y Formato de Pago Online
3. Conclusiones
4. Glosario
5. Literatura & Enlaces

0. Introducción

La herencia es otro de los mecanismos disponibles en la programación orientada a objetos que nos permite a nuestras soluciones software evolucionen con el paso del tiempo, pero sobretodo que modelen un problema de dominio usando los elementos que interactúan para dar solución a un problema. C# cuenta con este mecanismo y su uso es muy sencillo, sin embargo hay que entender sus principios para comprender las situaciones en las que corresponda su uso. En este artículo les voy a presentar cómo en C# se logra la herencia; además de la inclusión de un ejemplo de una aplicación real que he desarrollado.

1. Herencia en C#

La programación orientada objetos está compuesta por cuatro grandes conceptos: herencia, poliformismo, abstracción encapsulación. En el caso particular de la herencia, es el medio por el cual se puede crear relaciones entre los tipos de datos definidos por el usuario, e inclusive, los que ya vienen en la biblioteca de clases estándar de .NET. La relación mencionada consiste en definir miembros comunes a un conjunto de tipos de objetos, y empezando con la agrupación de los miembros (factores) comunes sobre un tipo general o abstracto (e.g.: System.Object [3]), luego, proporcionar/heredar a través de la herencia o especialización la funcionalidad a tipos derivados (e.g.: System.String [5]). Veámoslo gráficamente:
Herencia de Object a String
Figura 1. Herencia de Object [3] a String [4].
Observemos que esta relación de herencia entre Object y String nos permite apreciar una ventaja evidente: la reutilización de funcionalidad del tipo base Object sobre el tipo derivado String. Hay que observar el caso del miembro ToString() que ha sido sobreescrito en el tipo derivado; esto consiste en crear una implementación particular sobre el tipo derivado y omitir la herencia que provee el tipo base.

Un ejemplo más:
Herencia de Figura
Figura 2. Herencia de objetos Figura.
Los tipos de objetos Circulo, Triangulo, y Rectangulo, son especializaciones del tipo abstracto Figura. Éste último define los miembros comunes a todos los demás objetos, una vez se aplique la relación se puede construir frases relacionales como:
  • Un Circulo es una Figura.
  • Un Triangulo es una Figura.
  • Un Rectángulo es una Figura.
Hasta este punto ya hemos hablado del concepto de clase base (o clase padre), y clase derivada (clase hija). En el primer caso, clase base, está posee los miembros que serán heredados; entonces, la clase derivada heredará esos miembros (propiedades, métodos, campos de instancia, etc.). A esto hay que agregar que en C# sólo está permitada la herencia simple, es decir, sólo está permitido heredar de una única clase base. Así mismo, la herencia es transitiva:
Figura 3. Transitividad en la herencia.
La transitividad consiste en si ClaseC deriva de ClaseB, y ClaseB deriva de ClaseA, por consiguiente ClaseC deriva los miembros declarados en ClaseB y ClaseA.

Equivalencia en código fuente C#:

Archivo C# ClaseA.cs [enlace alternativo]:
Archivo C# ClaseB.cs [enlace alternativo]:
Archivo C# ClaseC.cs [enlace alternativo]:
Continuando, el mecanismo de herencia en C# no permite heredar ni constructores ni destructores. Esto resulta de la evidencia de especialización de los tipos derivados: cada nuevo tipo de dato debe especificar e implementar de forma arbitraria la instanciación y la destruccción de nuevos objetos.

Como anotación adicional de [2]:
Las estructuras no soportan herencia, pero sí la implementación de interfaces.
Figura 4. La herencia no está soportanda en estructuras [2].

1.1 Métodos abstractos y virtuales

Si en la clase base reside un método marcado como virtual a través de la construcción virtual [5], la clase derivada puede (opcional) sobrescribir tal método con su propia implementación. Por otro lado, si un método es marcado como abstracto a través de abstract [6], la clase derivada debe (obligatorio) crear la implementación para ese miembro.

1.2 Clases base bbstractas

Una clase base abstracta evita la creación de instancias de un tipo de objeto. La clase base puede contener métodos con implementación concreta, y miembros abstractos. Por lo tanto al aplicar herencia, la clase derivada deberá implementar los miembros abstractos, o de lo contrario será considerada abstracta.

1.3 Interfaces

Una interfaz es un contrato, protocolo o conjunto de métodos abstractos y constantes. Cuando una clase implementa una interfaz, debe especificar una implementacion para todos los miembros abstractos de la interfaz. Además, se permite la implementación de varias interfaces.

2. Sistema de Extractos, Certificados y Formato de Pago

En una de las experiencias como experto independiente, tuve la oportunidad de desarrollar, mantener y extender un sistema de gestión de reportes para extractos, certificados y formato de pago (o cupón de pago) para varias inmobiliarias importantes de la ciudad de Bogotá. Lo que quiero extraer de esta experiencia es un ejemplo en donde se aplica el mecanismo de herencia para establecer una jerarquía de reportes.

A continuación presento el diagrama de clases simplificado que describe la relación de herencia entre los tipos de objeto:
  • Reporte
    • ReporteCertificado
    • ReporteExtracto
    • ReporteFormatoPago
Relación de herencia de reportes.
Figura 5. Relación de herencia de reportes.
Mi decisión de diseño consistió en agrupar miembros comunes sobre la clase Reporte y reusarlos sobre los demás reportes. Fue una idea intuitiva producto del concepto abstracto de factorización (utilizo este término análogo al del álgebra). Las demás clases ReporteCertificado, ReporteExtracto, y ReporteFormatoPago se especializaron en tareas particulares a cada tipo de reporte.

3. Conclusiones

En este artículo he presentando el concepto de herencia, uno de los pilares de la programación orientada objetos que permite crear aplicaciones atadas al mundo real (la interacción entre objetos, además de sus propiedades o características). Presenté ejemplos sencillos para ilustrar este mecanismo de relación de tipos de objetos, además, una presentación de la transtividad de clases.

4. Glosario

  • Abstracto
  • Clase base
  • Clase derivada
  • Herencia
  • Interfaz
  • Método abstracto
  • Método virtual
  • Super clase
  • 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]: Inheritance (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms173149.aspx
[3]: Object Class (System) - http://msdn.microsoft.com/en-us/library/system.object.aspx
[4]: String Class (System) - http://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx
[5]: virtual (C# Reference) - http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.110).aspx
[6]: abstract (C# Reference) - http://msdn.microsoft.com/en-us/library/sf985hc5(v=vs.110).aspx


O

4 comentarios:

  1. Muy bueno, donde puedo encontrar el índice, saludos.

    ResponderEliminar
    Respuestas
    1. Hola Ángelo, ¿a qué índice te refieres? ¿Quizás sea la tabla de contenido que se encuentra en la parte superior del artículo?

      Saludos desde Bogotá D.C.

      Eliminar
    2. Nono osea todos los puntos que conlleva aprender C#, desde lo mas basico hasta lo mas avanzado.
      Saludos amigo John.

      Eliminar
    3. Hola Ángelo,

      La primera referencia bibliográfica es excelente para conocer infinidad de detalles de C#. Te recomiendo explorar las apps Cupi2.NET donde se aplican los conceptos expuestos en esa bibliografía. Eso lo hallas en este mismo blog.

      Saludos,

      Eliminar

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