martes, 20 de mayo de 2014

Tipos Anidados en C#

Tabla de Contenido

0. Introducción
1. Definición de Tipo Anidado
1.1 Características de los tipos anidados
1.2 Acceso a miembros externos
1.3 Acceso a miembros de tipos anidados desde tipo externo
2. Clases Anidadas y Miembros Estáticos
3. Clases Anidadas y Acceso a Sus Miembros
4. Orden de Ejecución de Constructores en una Jerarquía de Herencia con Tipos Anidados
5. Directivas de Uso de Tipos Anidados
6. Conclusiones
7. Glosario
8. Literatura & Enlaces

0. Introducción

En esta nueva ocasión vamos a aprender a trabajar con tipos anidados (clases, interfaces, enumeraciones, delegados, y eventos) C#. Tocaremos varios de los temas esenciales en el uso de tipos anidados. Como: definición general, acceso a miembros estáticos y no estáticos, constructores en clases anidadas, inclusive, herencia e implementación; por otro lado, trataremos acerca de las circunstancias adecuadas de uso de tipos anidados.

1. Definición de Tipo Anidado

Un tipo (i.e, clase, interfaz, enumeración, delegado, y evento) anidado consiste en un tipo (solo clases o enumeraciones) declarado dentro del cuerpo de declaración. Estos tipos anidados mantienen una estrecha relación con su tipo de nivel superior (en la sección de guías de buen uso de tipos anidados lo veremos con más detalle) y, en esencia, soporta la definición funcional y característica del tipo externo (o padre).

Veamos un ejemplo de declaración de un tipo anidado (ejemplo abstracto):

public class ClaseExterna
{
public class ClaseAnidada
{
// Implementación
}

public enum Color
{
Rojo,
Verde,
Azul
}
}

Nótese que la declaración de los tipos anidados (en el caso, ClaseAnidada, y Color) sigue la misma notación que la de un tipo externo (como ClaseExterior).

1.1 Características de los tipos anidados

De acuerdo con [1], los tipos anidados presentan las siguientes características:
  • Desde el tipo anidado se puede acceder todos los miembros del tipo externo.
  • Para los tipos anidados están permitidos todos los modificadores de acceso -cfr. Modificadores de Acceso en C#-.
  • El modificador por defecto para los tipos anidados es private.
  • Se debe utilizar la nomenclatura de nombre de clase completamente calificado (FCQN) para acceder los miembros del tipo anidado desde el exterior.
Para el último caso, aquí tenemos un línea de código de uso:

ClaseExterna.Color color = ClaseExterna.Color.Rojo;

1.2 Acceso a miembros externos

Podemos acceder a los miembros no estáticos que contiene el tipo externo. Para lograrlo, podemos crear una instancia del externo, y así poder acceder sus miembros. En código:

public class ClaseExterna
{
public class ClaseAnidada
  {
private ClaseExterna ce;

public ClaseAnidada
{
}

public ClaseAnidada(ClaseExterna ce)
{
this.ce = ce;
}
}
}

1.3 Acceso a miembros de tipos anidados desde el tipo externo

public class ClaseExterna
{
public class ClaseAnidada
{
public ClaseAnidada()
{
Console.WriteLine("Creación instancia de ClaseAnidada.");
}
}

public void Metodo()
{
ClaseAnidada ca = new ClaseAnidada();
}
}

En las siguientes secciones nos extenderemos en varios de los detalles que comprometen el uso de los tipos anidados: miembros estáticos, constructores, acceso a miembros de clases contenedoras (o externas), herencia e implementación.

2. Clases Anidadas y Miembros Estáticos

Una clase anidada puede contener en su cuerpo de declaración los miembros estáticos que sean necesarios de acuerdo a su lógica de implementación. ¿Cómo accedemos estos miembros desde una clase contenedora o externa?



Resultado:

Contenido de `ClaseExterna.ClaseAnidada.Valor` : 101

Observemos que en la línea 31 se obtiene el valor de `valor` usando el nombre de clase completamente calificado.

3. Clases Anidadas y Acceso a Sus Miembros

Podemos acceder a los miembros de los tipos (en este caso, una clase) externos desde los tipos anidados, también, especificando su nombre de clase completamente calificado, claro, cuando se trata de miembros estáticos; de lo contrario, tenemos que usar una instancia del tipo externo para acceder a sus miembros (como en la sección 1.3).

Veamos con código fuente C# cómo lograrlo:

Archivo AccesoMiembrosClaseExterna.cs:



Vemos que en las líneas 27-28 se usa el nombre de clase completamente calificado de ClaseExterna para acceder a su miembro valor.

> Prueba de ejecución.

Resultado:

Contenido de `ClaseExterna.Valor` : 101

4. Orden de Ejecución de Constructores en una Jerarquía de Herencia con Tipos Anidados

Un tipo anidado puede heredar de su tipo contenedor (clase externa, por ejemplo). Se sigue la misma sintaxis de herencia para tipos externos. Creemos el siguiente código fuente C# para comprobarlo:

Archivo ConstructoresTiposAnidados.cs:



El orden de invocación de los constructores obedece el orden desde tipo de mayor jerarquía (tipo base) hasta el de inferior jerarquía (subtipos).

> Prueba de ejecución.

Reusltado:
Resultado invocación en herencia de tipos anidados
Figura 1. Resultado invocación en herencia de tipos anidados.

5. Directivas de Uso de Tipos Anidados

De acuerdo con [4, 5], estas son las situaciones en donde es (y no) apropiado el uso de tipos anidados:
  • Use tipos anidados cuando...
    • El tipo anidado tiene una estrecha relación con el tipo externo, es decir, que el grado de acoplamiento sea alto.
      • Ejemplo de uso: enumeradores de elementos de una colección.
      • La clase ListBox [8] posee la clase Interna SelectedObjectCollection : IList para referirse a los elementos seleccionados en su estructura.
  • No use tipos anidados cuando...
    • Los tipos anidados van a ser instanciados desde el exterior (código cliente).
    • El tipo anidado va a ser invocado, por ejemplo, como un argumento en un método. (Una enumeración por ejemplo).

6. Conclusiones

Los tipos anidados son una piensa importante en la composición de tipos (en particular, clases) ya que permiten extender el comportamiento de implementación sobre segmentos más especializados en el cuerpo de declaración de un tipo. Vimos la sintaxis declarativa de tipos anidados, invocación de miembros estáticos y no estáticos; más adelante, el orden de invocación de constructores en jerarquía de herencia que compromete tipos anidados. Al final, vimos algunas directivas de uso de tipos anidados útiles para decisiones de diseños de este tipo estructura. 

7. Glosario

  • Clase
  • Delegado
  • Enumeración
  • Miembro
  • Tipo
  • Tipo anidado

Literatura & Enlaces

[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]: Nested Types (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms173120.aspx
[3]: C# Interview Questions: Nested Types in C# - http://venkatcsharpinterview.blogspot.com/2009/07/nested-types-in-c.html
[4]: Nested Type Usage Guidelines - http://msdn.microsoft.com/en-us/library/tdz1bea9(v=vs.71).aspx
[5]: .NET Type Design Guidelines—Nested Types — Visual C# Developer Center - http://tutorials.csharp-online.net/index.php?title=.NET_Type_Design_Guidelines%e2%80%94Nested_Types
[6]: A Tutorial on Nested Classes in C# - CodeProject - http://www.codeproject.com/Articles/20628/A-Tutorial-on-Nested-Classes-in-C
[7]: Modificadores de Acceso en C# | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/04/modificadores-de-acceso-en-c.html
[8]: ListBox Class (System.Windows.Forms) - http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

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