Hola a todos.
Bueno, seguro que cuando leáis este post lo primero que vais a pensar es "¿Qué hace el
friki este escribiendo un post un sábado a las 4 de la mañana? ¿No tiene nada mejor que hacer?"
Vale. Soy un frikazo ¿Y qué?
En fin, he estado dando vueltas a una cosa y quería comentarla con los máquinas de mis colegas de gremio.
No voy a entrar en el origen de mi problema. Voy a ir directamente a la esencia del mismo: Hacer casting entre clase padre e hija.
Voy a hacer un ejemplo que simplifica al máximo el problema.
Tenemos una clase base y una clase derivada.
public class BaseClass
{
private int property1;
public int Property1
{
get { return property1; }
set { property1 = value; }
}
}
public class DerivedClass : BaseClass
{
private int property2;
public int Property2
{
get { return property2; }
set { property2 = value; }
}
}
Vamos a ver todos los castings que podemos hacer.
De hija a base:
static void Main()
{
DerivedClass obj1 = new DerivedClass();
BaseClass obj2 = obj1;
}
Chupado. Como un objeto DerivedClass ya es un BaseClass, se puede hacer una conversión implítica.
De base a hija:
static void Main()
{
BaseClass obj1 = new DerivedClass();
DerivedClass obj2 = (DerivedClass) obj1;
}
Perfecto. Hacemos un casting de la clase base a la derivada. Es necesario hacer un casting explícito porque un objeto de la clase base no tiene por qué ser de la clase derivada. En nuestro caso sí lo es porque obj1 contiene un DerivedClass. No fallará ni en tiempo de complilación ni de ejecución. El compilador nos deja hacer esto sabiendo que nos arriesgamos a un petardazo en tiempo de ejecución, como ocurre en el siguiente ejemplo.
static void Main()
{
BaseClass obj1 = new BaseClass();
DerivedClass obj2 = (DerivedClass) obj1;
}
Compila pero da un petardazo lógico y normal en tiempo de ejecución. obj1 no contiene un DerivedClass.
En mi aplicación necesito hacer este casting. La solución es muy sencilla y a todos se nos ocurre enseguida. Haz un constructor de DerivedClass que reciba un BaseClass por parámetro. De esa forma la clase derivada queda así.
public class DerivedClass : BaseClass
{
public DerivedClass()
{
}
public DerivedClass(BaseClass parent)
{
this.Property1 = parent.Property1;
}
private int property2;
public int Property2
{
get { return property2; }
set { property2 = value; }
}
}
y el siguiente ejemplo funciona:
static void Main()
{
BaseClass obj1 = new BaseClass();
DerivedClass obj2 = new DerivedClass(obj1);
}
Hemos pasado de un objeto de la clase base a un objeto de la clase derivada.
Mi idea fue: Yo kiero ser más chulo y hacer eso con un casting (como el ejemplo que falla) en lugar de con el constructor. Pues me implemento un conversor propio (por ejemplo en la clase derivada) y a correr.
La clase derivada quedaría así:
public class DerivedClass : BaseClass
{
private int property2;
public int Property2
{
get { return property2; }
set { property2 = value; }
}
public static explicit operator DerivedClass(BaseClass parent)
{
DerivedClass result = new DerivedClass();
result.Property1 = parent.Property1;
}
}
Hago el conversor explícito en lugar de implícito para no ser demasiado chulo.
El código que lo prueba queda:
static void Main()
{
BaseClass obj1 = new BaseClass();
DerivedClass obj2 = (DerivedClass) obj1;
}
Pues bien. Esto, que a mi me parecía lógico, no compila. Da el siguiente error en la clase DerivedClass:
"user defined conversion to/from base class"
El número de error es CS0553
He investigado un poco y he visto la página de Microsoft donde está documentado el error. http://msdn.microsoft.com/en-us/library/031a701z(VS.80).aspx
Según ellos, no puedes hacerlo porque no lo necesitas.
Estamos de acuerdo en que no necesito un conversor propio para pasar de una clase hija a una clase padre, pero para pasar de una clase padre a una hija sí estaría bien. De hecho en el link que os he mandado hay un comentario de uno al que le pasa lo mismo que a mi.
Nadie le ha dado respuesta desde Microsoft...
Espero vuestros comentarios.
Saludos.
domingo, 9 de noviembre de 2008
viernes, 7 de noviembre de 2008
Guía de arquitectura de aplicación - Release
He leído el tema de Laurent, acerca de la guía de arquitectura de aplicación 2.0 beta, y encontré que es efectivamente útil. Lo bueno es que ya está la siguiente versión o release. Así que Arquitectos de soluciones, desarrolladores y jefes de proyecto técnicos, podremos encontrar allí un repositorio actualizado de la guía más interesante de diseño de arquitectura.
Patterns & practices: App Arch Guide project http://www.codeplex.com/AppArch
Patterns & practices: App Arch Guide project http://www.codeplex.com/AppArch
martes, 4 de noviembre de 2008
¿Reinventar la rueda? No gracias
Buenos días, Geeks del desarrollo.
Me he decidido a escribir esta entrada a raíz de una investigación que he realizado recientemente previa al desarrollo de la web de un amigo mío. El caso es que es odontólogo y necesita (bueno yo se la voy a regalar por su cumpleaños) una web promocional para sus clínicas dentales.
Entonces me puse manos a la obra:
Abrir Visual Studio 2008 (por supuesto), New Project... Web Project... y despues de obtener el maravilloso "Empty Web Project" tuve el problema que tienen los escritores cuando se enfrentan a un folio en blanco, igualito. Decisiones sencillas como gestión de usuarios, perfiles, base de datos etc las tenía claras pero... Qué pereza empezar a desarrollar todo desde cero. Diseña la Master, estructura de la web... Realmente me gustaría saber cuánto tiempo se pierden actualmente en los proyectos, nuestros proyectos, en desarrollar módulos que ya están desarrollados. Un sabio profesor de universidad me dijo, puede haber un mismo trabajo de Ingeniería en un desarrollo a medida con un I+D impresionante, como en un análisis de mercado analizando herramientas existentes que puedan cubrir mis necesidades.
Entonces me vino a la cabeza la pregunta clave: ¿No abrá algún proyecto en el que me pueda basar, con una estructura válida que pueda utilizar, con gran parte del trabajo tedioso hecho? Pues afortunadamente la respuesta final es que sí.
Encontré los Starter Kits and Community Projects.
Nos encontramos una veriedad generosa de proyectos 'base', tales como foros, webs de anuncios, webs para comunidades y muchos mas. Algunos mediante Instaladores de Contenido para Visual Studio, otros con proyectos ya desarrollados que tendremos que abrir nosotros, copiandolos en local.
Este elenco de proyectos OpenSource nos proporcionan una estupenda base para poder empezar con un esqueleto ya realizado, ideal para vagos (como yo).
De todas formas, estos proyectos contienen detalles muy interesantes en su interior. Seguro que os sorprende a más de uno la estructura de algunos proyectos y la utilización de controles base del Framework. Que sí, que a todos se nos llena la boca diciendo las maravillas del FrameWork, que si es potentisimo, que si nos ahorra mucho trabajo, que si tal que si cual... pero la gestión de perfiles y usuarios nos la hacemos nosotros, en vez de utilizar la potente gestión del propio FrameWork xej. Ya se que esto es aplicable en función de necesidades del proyecto, pero ya me entendéis. En estos proyectos encontraréis 100% exprimidos los controles Web del FrameWork, y en muchos casos sorprende la funcionalidad conseguida en función de las líneas de código implementadas.
Bueno os animo a que le dediquéis un ratejo para investigar lo que os podéis encontrar, pero os adelanto algo:
Classifieds Site Starter Kit:
Base de un proyecto web para clasificados (anuncios que perduran un tiempo x)
Job Site Starter Kit:
Base para un proyecto web para trabajos (empresas vs empleados)
Kigg Starter Kit:
Base para un proyecto web estilo Digg
Y bueno, muchos mas en http://www.asp.net/community/projects/
Me he decidido a escribir esta entrada a raíz de una investigación que he realizado recientemente previa al desarrollo de la web de un amigo mío. El caso es que es odontólogo y necesita (bueno yo se la voy a regalar por su cumpleaños) una web promocional para sus clínicas dentales.
Entonces me puse manos a la obra:
Abrir Visual Studio 2008 (por supuesto), New Project... Web Project... y despues de obtener el maravilloso "Empty Web Project" tuve el problema que tienen los escritores cuando se enfrentan a un folio en blanco, igualito. Decisiones sencillas como gestión de usuarios, perfiles, base de datos etc las tenía claras pero... Qué pereza empezar a desarrollar todo desde cero. Diseña la Master, estructura de la web... Realmente me gustaría saber cuánto tiempo se pierden actualmente en los proyectos, nuestros proyectos, en desarrollar módulos que ya están desarrollados. Un sabio profesor de universidad me dijo, puede haber un mismo trabajo de Ingeniería en un desarrollo a medida con un I+D impresionante, como en un análisis de mercado analizando herramientas existentes que puedan cubrir mis necesidades.
Entonces me vino a la cabeza la pregunta clave: ¿No abrá algún proyecto en el que me pueda basar, con una estructura válida que pueda utilizar, con gran parte del trabajo tedioso hecho? Pues afortunadamente la respuesta final es que sí.
Encontré los Starter Kits and Community Projects.
Nos encontramos una veriedad generosa de proyectos 'base', tales como foros, webs de anuncios, webs para comunidades y muchos mas. Algunos mediante Instaladores de Contenido para Visual Studio, otros con proyectos ya desarrollados que tendremos que abrir nosotros, copiandolos en local.
Este elenco de proyectos OpenSource nos proporcionan una estupenda base para poder empezar con un esqueleto ya realizado, ideal para vagos (como yo).
De todas formas, estos proyectos contienen detalles muy interesantes en su interior. Seguro que os sorprende a más de uno la estructura de algunos proyectos y la utilización de controles base del Framework. Que sí, que a todos se nos llena la boca diciendo las maravillas del FrameWork, que si es potentisimo, que si nos ahorra mucho trabajo, que si tal que si cual... pero la gestión de perfiles y usuarios nos la hacemos nosotros, en vez de utilizar la potente gestión del propio FrameWork xej. Ya se que esto es aplicable en función de necesidades del proyecto, pero ya me entendéis. En estos proyectos encontraréis 100% exprimidos los controles Web del FrameWork, y en muchos casos sorprende la funcionalidad conseguida en función de las líneas de código implementadas.
Bueno os animo a que le dediquéis un ratejo para investigar lo que os podéis encontrar, pero os adelanto algo:
Classifieds Site Starter Kit:
Base de un proyecto web para clasificados (anuncios que perduran un tiempo x)
Job Site Starter Kit:
Base para un proyecto web para trabajos (empresas vs empleados)
Kigg Starter Kit:
Base para un proyecto web estilo Digg
Y bueno, muchos mas en http://www.asp.net/community/projects/
Suscribirse a:
Entradas (Atom)