domingo, 31 de agosto de 2014

Pregunta C# (5 de 20): ¿Cómo Invocar el Constructor de una Clase Base?

Índice

0. Introducción
1. Contexto
1.1 ¿Qué es un constructor?
1.2 ¿Cómo se define un constructor?
2. Métodos de Invocación de un Constructor de una Clase Base
2.1 Método 1: Forma básica
2.2 Método 2: Modificación temprana de argumentos de constructor base
2.3 Método 3: Patrón factory
3. Artefactos y Recursos
4. Conclusiones
5. Glosario
6. Literatura & Enlaces

0. Introducción

Esta pregunta constituye la número 5 del curso de Twenty C# Questions Explained de Microsoft Virtual Academy (MVA). Ahora entraremos en los detalles del proceso de invocación del constructor de una clase base (o superclase) a partir de una subclase de la jerarquía de herencia en un dominio específico. Conoceremos específicamente 3 métodos para realizar esta tarea: uso estándar, modificación temprana del argumento o cualquier otra operación antes de invocar el constructor de la clase base, y la creación de un clase con el patrón factory.

1. Contexto

1.1 ¿Qué es un constructor?

Los constructores son métodos especiales encargados de la inicialización del estado de una instancia u objeto a crear. Veremos que existe una diferencia sutil entre un método y un constructor: éste último en su definición no especifica un valor de retorno (ni siquiera void).


[Nota: Recomiendo la lectura acerca de constructores en su versión extendida: Constructores de Instancia.]

1.2 ¿Cómo se define un constructor?

Para definir un constructor en el cuerpo de declaración de una clase ya sea abstracta o concreta, seguimos la siguiente especificación sintáctica:

public class Superclase
{
{modificador-acceso} Superclase({lista-parametros})
{
// Cuerpo de declaración del constructor
}
}

Debemos especificar un modificar de acceso (cfr. Modificadores de Acceso), omitimos el tipo de retorno y finalmente el nombre del constructor debe corresponder con el nombre de la clase donde se haya declarado, en este caso Superclase, y finalmente, el conjunto o lista de parámetros para la inicialización del estado del objeto.

1.3 Uso de un constructor

Para hacer uso de un constructor de código cliente es necesario combinar el nombre de la clase junto con los parámetros de inicialización y el operador de instanciación new:

SuperClase objSc = new SuperClase({lista-parametros});

2. Métodos de Invocación de un Constructor de una Clase Base

A continuación describiremos tres formas básicas de la invocación de un constructor desde una clase subclase sobre una jerarquía de herencia.

2.1 Método 1: Forma básica

La primera forma consiste en la más básica, simple, y directa de invocar un constructor de una clase base, por ejemplo, para la inicialización de miembros de la superclase. Para demostrar su uso utilicemos la siguiente jerarquía de herencia de Persona:
Jerarquía de Herencia Persona
Figura 1. Jerarquía de herencia Persona.
Ahora escribamos las clases implementadas en código fuente C#; empezando por la clase abstracta Persona:

En las líneas 23-26 declaramos el constructor de la clase abstracta Persona y especificamos como único parámetro nombrePersona de tipo string.

Ahora pasemos a escribir la clase Estudiante que hereda de forma directa de la clase Persona:

Para empezar, en la línea 5 especificamos la herencia directa de la clase Estudiante desde la clase Persona. Ahora el punto importante que queremos resaltar: sobre la línea 24 utilizamos la palabra clave base [4] seguida de paréntesis con el conjunto de argumentos de uno de los constructores de la clase base, específicamente, el constructor con un solo parámetro -nombrePersona-. Luego en el cuerpo del constructor de Estudiante efectuamos la asignación del carnet del estudiante. Por motivos de simplicidad creamos el método Main (líneas 29-35) para crear una instancia de Estudiante y pasar como argumentos al constructor el nombre del estudiante y su respectivo carnet de identidad:

public Estudiante (string, string)


Ahora procedamos a compilar, ejecutar, y probar estos artefactos.


Compilación:


  1. csc /target:exe Estudiante.cs Persona.cs

Ejecución assembly:


  1. .\Estudiante.exe

> Prueba de ejecución (ideone.com).

> Prueba de ejecución (local):
Ejecución assembly Estudiante.exe
Figura 2. Ejecución assembly Estudiante.exe.

2.2 Método 2: Modificación temprana de argumentos de constructor base

Antes de pasar un argumento a un constructor de clase base (superclase) podemos alterar su contenido o representación de acuerdo a una lógica arbitraria que deseemos especificar para nuestros artefacto. De ahí que llamemos a este método modificación temprana de argumentos de constructor. Pasemos a una demostración concreta de este método para conocer su uso y utilidad.

Partimos de la misma jerarquía de herencia modelada en la Figura 1; ahora lo que tenemos que hacer es crear la clase Empleado:

Resaltemos en esta archivo C# el constructor de la clase Empleado en las líneas 23-27; en este caso la invocación al constructor de la clase base Persona, antes de pasar el valor que corresponde con el nombre del empleado su representación es pasada a mayúsculas (simulación de un requerimiento para los nombres de los empleados), esto se logra a través de la invocación del método CambiarMayusculas (líneas 30-33):

private static String CambiarMayusculas(string)


Vale mencionar que este método debe ser static para ser invocado, debido a que antes de crear la instancia sólo se pueden invocar miembros que cumplan esta característica, de lo contrario se generará el error CS0120 [5].


Compilación:


  1. csc /target:exe Empleado.cs Persona.cs

Ejecución assembly:


  1. .\Empleado.exe

> Prueba de ejecución (ideone.com).

> Prueba de ejecución (local):
Ejecución assembly Empleado.exe
Figura 3. Ejecución assembly Empleado.exe.

2.3 Método 3: Patrón factory

Otra de las características importantes sobre el alcance de un constructor es que podemos hacer que sólo tenga acceso o visibilidad sobre la clase en donde es declarado, es decir, private. Esto nos sirve para implementar el patrón factory [6], un patrón del tipo de creación que básicamente consiste en especificar un método static que se encarga de crear los objetos de una clase específica sin el uso del operador new desde código cliente. Veamos un fragmento de código C# para comprender específicamente de que estamos hablando:

public class Subclase : Superclase
{
private Subclase(string cadena) : base(cadena)
{
// implementación
}

// Método para la creación de objetos Subclase:
public static Subclase MetodoFactory(string cadena)
{
return new Subclase(cadena);
}
}

3. Artefactos y Recursos

Conjunto de artefactos producidos a lo largo del desarrollo de la explicación de esta pregunta acerca de la invocación de constructores:
Este es el vídeo en donde el equipo de expertos (Gerry O'Brein y Paul Pardi) de MVA responden y explican esta pregunta:

4. Conclusiones

Con este nuevo conocimiento de cómo invocar un constructor de una clase base, ya podemos prestar más atención a casos sutiles en donde se requiere cierta pericia a la hora de implementar un mundo o dominio de un problema. En la próxima pregunta C# explicaremos cómo contar el número de ocurrencias de una cadena de caracteres dentro de un objeto String.

5. Glosario

  • Argumento
  • Base
  • Clase padre
  • Constructor
  • Herencia
  • Jerarquía
  • Parámetro
  • Subclase
  • Superclase

6. Literatura & Enlaces

[1]: Twenty C# Questions Explained - http://www.microsoftvirtualacademy.com
[2]: Constructores de Instancia en C# | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2013/10/constructores-de-instancia-en-c.html
[3]: OrtizOL - Experiencias Construcción Software (xCSw): Modificadores de Acceso en C# - http://ortizol.blogspot.com/2014/04/modificadores-de-acceso-en-c.html
[4]: base (C# Reference) - http://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx
[5]: Compiler Error CS0120 - http://msdn.microsoft.com/en-us/library/s35hcfh7.aspx
[6]: Factory method pattern - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/Factory_method_pattern


A

No hay comentarios:

Publicar un comentario

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