Pero en fin, pasemos al tema que quería tratar.
Entiendo que conocen lo que son las propiedades de C#. Si no es así, recomiendo apreneder eso primero. Vemos que las propiedes pueden ser muy útiles.
Para seguir, sabemos que el compilador de C#, transforma las propiedades en métodos para mantener la compatibilidad con los lenguajes .NET que no las soportan.
Por ejemplo, si tenemos la propiedad siguiente:
public int NumeroPositivo
{
set
{
if(value >= 0)
num = value;
}
get
{
return num;
}
}
Lo que hace el compilador es generar algo como esto:
public set_NumeroPositivo(int value)
{
if(value >= 0)
num = value;
}
public int get_NumeroPositivo()
{
return num;
}
Entonces, como al fin y al cabo se generan dos métodos y la propiedad "se pierde" (por llamarlo de alguna manera), se me ocurrió que tal vez podría sobrecargar el método set_xxxx () para que se pueda cargar con diferentes tipos de valores. Para entender mi idea, les muestro como sería el proceso inverso:
Si tenemos los siguientes métodos:
public set_NumeroPositivo(string value)
{
if(value == "uno")
num = 1;
if(value == "dos")
nume = 2;
//... etc etc...
}
public set_NumeroPositivo(int value)
{
if(value >= 0)
num = value;
}
public int get_NumeroPositivo()
{
return num;
}
¡¡Mas allá de la poca funcionalidad que tenga esto!! Es solo un ejemplo, pero podría llegar a necesitarse usar algo asi. Bien, según esos métodos, nosotros podríamos pensar en que vienen de una propiedad. Es decir, realizamos el proceso inverso al que efectúa el compilador. Lo que podría llegar a quedarnos es lo siguiente:
public int NumeroPositivo
{
set
{
if(value >= 0)
num = value;
}
get
{
return num;
}
}
public string NumeroPositivo
{
set
{
if(value == "uno")
num = 1;
if(value == "dos")
num = 2;
//.. etc etc..
}
}
Digamos que para esta supuesta sobrecarga de propiedad, las condiciones serían:
* Que difiera el tipo de dato (en nuestro caso son int y string).
* Que no se implmente el bloque get en las sobrecargas.
Pregunté en muchos foros si era posible sobrecargar propiedades y me dijeron que no. Que usara métodos. Pero al fin y al cabo, usar métodos es volver al penúltimo código que mostré aquí. Bien, no se puede hacer entonces, pero ¡que bueno sería que se pudiera!
Me encotré con esta inquietud mientras revisaba un código medio feucho que tenía que re-codificar: Vi un método sobrecrgado que solo asignaba un valor a un campo privado. Y se podía tomar como enumeración o como string, pero al fin y al cabo era lo mismo. Y allí surgió mi pregunta.
Espero que no haya significado mucha pérdida de tiempo esto, debido a que es irrealizable. Solo quería mostrar la curiosidad.
Saludos.
hola nacho, felicidades por tu nuevo blog :) Lo miraré seguido porque como te comenté ando con c# tb..(quise entrar como 'rochi' pero no se, no me desloguea..bueh)...saludos
ResponderEliminarhola, no se puede porque el get debe reconocer al tipo devuelto, y ahí se arma lío. Tuve una inquietud similar ante un problema diferente, quizás lo mas parecido que encontré, y tal vez se adapte a lo que queres es usar para realizar conversiones son los operadores implícitos. No siempre son aconsejables, depende del problema como siempre, y por lo tanto a veces necesarios.
ResponderEliminarTe dejo un link de ejemplo http://nhibernate.codebetter.com/blogs/david.hayden/archive/2007/02/06/User_2D00_Defined-Conversions-in-C_2300_.aspx (inglés)
(Asumo por tu ejemplo que generics no viene al caso)
saludos...rochi
Hola RO! Che, que buenos los operadores esos! No los conocia, me parecen muy buenos.
ResponderEliminarGracias por ser la segunda visitante de mi blog!! Jaja!
Saludos, nos vemos!
Nullbrain, me olvidé de aclararte algo respecto del post:
ResponderEliminarMi idea de sobrecarga se refiere a sobrecargar sólo los SET, es decir, que mi idea es poder tener UN SOLO get pero ninguno o uno o varios SET, ¿se entiende la idea?
si, si, entendí, por eso te decía que lo que mas se aproxima a esto son los operadores implícitos.
ResponderEliminarUna forma *menos prolija* es que dentro del set preguntes por el tipo de parámetro. Algo asi como:
set
{
if (value is System.String )
{
objetoX = new ClaseX();
objetoX.nombre =((string)value).Split('!')[0];
objetoX.id=int.Parse(((string)value).Split('!')[1]);
return;
}
if ( value is ClaseX)
{
ObjetoX= value as ClaseX;
return;
}
La otra operadores implícitos imagina que tenes una clase Libro, y queres hacer algo así como
Libro.Autor = "Nacho"
o Libro.Author = unaPersona; //objeto
Lo mas 'similar', quedaría:
public static implicit operator Libro(string nomAutor)
{
Libro libro = new Libro();
Libro.Autor = nomAutor;
return Libro;
}
public static implicit operator string(Libro libro)
{
return libro.nomAutor;
}
O los 'gets' que necesites, como viste que puede hacerse.
saludosssss
Sie haben einige schöne Punkte gibt. Ich habe eine Suche über den Gegenstand und fand vor allem die Menschen mit Ihrem Blog Zustimmung.
ResponderEliminar