domingo, 23 de febrero de 2014

Constructores y Herencia en C#

Tabla de Contenido

0. Introducción
1. Herencia
2. Constructores
3. Uso de Constructores en Herencia
3.1 Invocación implícita de constructores sin parámetros de clase base
3.2 Orden de inicialización de constructores y campos
4. Conclusiones
5. Glosario
6. Enlaces & Literatura

0. Introducción

Ya hemos cubierto dos temas importantísimos en de programación orientada a objetos: herencia (Herencia en C#) y constructores (Constructores de Instancia en C#). Vamos a conjugar estos dos conceptos para comprender el papel que juegan los constructores en una jerarquía de herencia. Cubriré el tema relacionado con la invocación de constructores de superclases desde subclases. Inclusive, hablaré acerca de la llamada de constructores sin parámetros de un constructor. Al final, se introducirá el concepto de orden de inicialización de campos de instancia y de los constructores.

1. Herencia

C# cuenta con el mecanismo de herencia, el cual permite la reusabilidad de código. Esta propiedad se alcanza definiendo un tipo de dato de orden superior (clase padre o clase base), y partir él crear subclases que aprovechen la definición de los miembros de la clase base. Veamos la siguiente figura:
Jerarquía de Herencia Figura
Figura 1. Jerarquía de Herencia Figura.
Definimos la clase Figura y especificamos varios métodos (Dibujar, EstablecerColor, y ObtenerColor). Las clases de segundo nivel (por así llamarlas) heredan la funcionalidad de su clase base. Evidentemente en los métodos en las clases base la implementación de los mismos puede cambiarse a una arbitraria.

Por otro lado, esta jerarquía de herencia permite modelar las relaciones entre las clases definidas en el modelo del mundo del problema de nuestra solución.

[Nota: Para conocer más acerca del funcionamiento de la herencia en C# ir Herencia en C#.]

2. Constructores

Los constructores son métodos especiales que permiten definir la implementación para el estado inicial de construcción/creación de una instancia de un objeto. La definición de un constructor, a diferencia de los métodos, no debe especificar el tipo de dato de retorno en la firma. Por ejemplo:

public NombreClase(string n) // Definición del constructor de instancia
{
name = n; // Sentencia de inicialización
}

¿Cómo invocamos un constructor? La invocación de un constructor ocurre en el instante que creamos una instancia de un tipo de dato. Por ejemplo:

Usuario objUsuario = new Usuario ("Valentina"); // Llamada al constructor
[Nota: Para más información acerca de constructores en C: Constructores de Instancia en C#.]

3. Constructores y Herencia

Para las clases base se debe declarar sus propios constructores [1]. Sin embargo, desde una subclase se puede invocar los constructores de la clase base. A esto hay que añadir que los constructores no participan en el proceso de herencia.

Ahora veamos esto con un ejemplo muy sencillo:

Archivo ConstructoresHerencia.cs:



En la línea 22 se intenta crear una instancia de la clase Subclase, esto hace que el compilador generé el error:


error CS1729: The type `Articulos.Ch03.ClaseBase' does not contain a constructor that takes `0' arguments

Con esto quiero llegar a la regla establecida por la especificación del lenguaje C#: La clase Subclase debe redefinir todos los constructores que requiera exponer a código cliente. Entonces, el construbor de Subclase debe quedar de la siguiente manera:

public Subclase (int x ) : base (x)
{
// Implementación del constructor con un argumento.
}
La construcción de C# -base- [4] permite especificar a través de una lista comatosa encerrada entre paréntesis el conjunto de parámetros que coincida con la firma del constructor de la clase padre (superclase). En este caso:

base (x)

De acuerdo con [1] hay que agregar todos los constructores de la clase base se ejecutan primero. Esto garantiza que se inicialice los constructores base después de los especializados.

3.1 Invocación implícita de constructores sin parámetros de clase base

En [1] nos advierten que si en una subclase se omite la construcción base después de la firma del constructor sin parámetros, se invoca el mismo constructor (sin parámetros) de la clase base.

En este ejemplo se demuestra:


Debido a que la clase Subclase no especifica base frente al constructor sin argumentos, se invoca la versión sin parámetros de la superclase. 

► Prueba de ejecución.

3.2 Orden de inicialización de constructores y campos

En el instante que creamos una instancia de un objeto, el proceso de inicialización ocurre de la siguiente manera [1]:

1. Incialización desde una subclase a una clase base:
a. Se inicializan los campos
b. Los argumentos del constructor de la clase base se evalúan.

2. Inicialización desde una clase base a una subclase:
a. El cuerpo del constructor se ejecuta.

Para afianzar este concepto, recurramos al siguiente ejemplo (adaptado de [1]):


Conclusiones

Tratamos acerca de los constructores y su relación con la herencia. Los constructores no se heredan en una jerarquía de herencia. También aprendimos acerca de la invocación implícita de constructores sin parámetros de una superclase. Al finalizar orden de ejecución de los campos y constructores de instancia.

Glosario

- Campo
- Constructor
- Herencia
- Método
- Resuabilidad

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]: Using Constructors (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms173115.aspx
[3]: Inheritance (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms173149.aspx
[4]: base (C# Reference) - http://msdn.microsoft.com/en-us/library/vstudio/hfw7t1ce%28v=vs.100%29.aspx


J

No hay comentarios:

Publicar un comentario

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