C# Caja: Ejercicio con indexadores

En la entrada “C# class LibroCalificaciones: Acceso a propiedades con descriptores de acceso get / set” se estudio como se pueden emplear los descriptores de acceso get/set para controlar el acceso a los datos privados de una clase, por ejemplo:

idx1

Dentro de una clase podemos almacenar listas de datos  en arrays pòr ejemplo, podemos acceder a estos miembros usando indexadores, estos permiten el acceso indexado a las listas de elementos usando su índice numérico o usando un índice basado en nombres.

modificadorAcceso tipoRetorno this[ TipoIndice1 nombre1, TipoIndice2 nombre2, ...]
{
    get
    {
          // usa nombre1, nombre2...para acceder a datos
    }
    set
    {
          // usa nombre1, nombre2...para acceder a datos
    }
}

Vamos a demostrar su uso con una clase llamada clsCaja que contiene un array con 3 miembros privados de tipo double con las propiedades longitud, altura, anchura. Para poder indexar por nombre del atributo al array de doubles también definiremos un arreglo de string con los nombres de las propiedades.

idx2

Ahora siguiendo la sintaxis de arriba vamos a definir dos indexadores, el primero más sencillo de entender permite acceder a los elementos del arreglo usando un índice numérico de tipo int.

idx5

El segundo indexador utiliza un índice string que representa el nombre de la medida que queremos obtener (“longitud”,”altura”,”anchura”).

Cada indexador devuelve -1 si su descriptor de acceso get detecta un subíndice no valido. Lo mismo hace set set si tratamos de establecer un elemento no valido.

idx6

Ahora ya podemos usar los indexadores:

idx7

Entradas relacionadas:

Ejercicio completo


/*
* Created by SharpDevelop.
* User: i.landajuela
* Date: 21/12/2016
* Time: 18:34
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;

namespace Indexadores
{

//Ejemplo de uso de descriptores de acceso get/set para controlar
//el acceso a miembros privados de la clase
class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}

//-----------------------------------------------------------------

public class clsCaja
{
private string[] nombres = {"longitud","altura","anchura"};
private double[] medidas = new double[3];

public clsCaja(double longitud, double anchura, double altura)
{
medidas[0]=longitud;
medidas[1]=anchura;
medidas[2]=altura;
}

//indexador para acceder a medidas por el número de indice entero
public double this[int indice]
{
get
{
//valida indice a obtener
if ((indice<0) || (indice >= medidas.Length))
{
return -1;
}
else
return medidas[indice];
} //fin get
set
{
if (indice>=0 && indice < medidas.Length)
medidas[indice] = value;
} //fin set

} // fin de indexador numérico

public double this[string nombre]
{
get
{
//localiza elemento a obtener
int i=0;
while((i<nombres.Length)&&(nombre!=nombres[i]))
i++;
return (i==nombres.Length) ? -1 : medidas[i];
}
set
{
int i=0;
while((i<nombres.Length)&&(nombre!=nombres[i]))
i++;
if(i!=nombres.Length)
medidas[i] =value;
}
} //fin de indexador string

}


class Program
{
public static void Main(string[] args)
{
clsCaja objCaja = new clsCaja(10,20,30);


objCaja[0] = 80;
Console.WriteLine("caja[\"longitud\"]={0}",objCaja["longitud"]);
objCaja["longitud"] = 90;
Console.WriteLine("caja[\"longitud\"]={0}",objCaja["longitud"]);

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

Anuncios

Un pensamiento en “C# Caja: Ejercicio con indexadores

  1. Pingback: C# ClassConstructor: Notas sobre constructores | Internet y GNU/Linux

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s