Esto no es posible en ningún lenguaje .NET debido a problemas de seguridad de tipo. En los lenguajes seguros para tipos, debe proporcionar covarianza para los valores de retorno y contravariancia para los parámetros. Tome este código:
class B {
S Get();
Set(S);
}
class D : B {
T Get();
Set(T);
}
Para los métodos Get
, covarianza significa que T
debe ser o bien S
o un tipo derivado de S
. De lo contrario, si tuviera una referencia a un objeto del tipo D
almacenado en una variable ingresada en B
, al llamar a B.Get()
, no obtendría un objeto representable como S
que rompa el sistema de tipos.
Para los métodos Set
, contravarianza significa que T
debe ser o bien S
o un tipo que S
deriva de. De lo contrario, si has tenido una referencia a un objeto de tipo D
almacenado en una variable de tipo B
, cuando llamó B.Set(X)
, donde X
fue de tipo S
pero no de tipo T
, D::Set(T)
obtendría un objeto de un tipo que no esperaba.
En C#, hubo una decisión consciente de no permitir el cambio de tipo cuando se sobrecargaban las propiedades, incluso cuando solo tenían una pareja getter/setter, porque de lo contrario tendrían un comportamiento muy inconsistente ("¿Quiere decir que puedo? cambie el tipo en el que tiene un getter, pero no uno con getter y setter? ¿Por qué no?!? " - Newbie Universo Alternativo Anónimo).
Todas las soluciones, excepto la que dice que no se puede realmente ayudar a la situación. Creo que el punto era poder tener una clase de Child (elegida como padre) y llamar SomeProperty y hacer que devolvieran un Child sin un elenco.Por supuesto que estoy adivinando el verdadero propósito como evryone else :) – mattlant
A pesar de que no existe una solución perfecta, la idea es encontrar la forma más clara de implementar esto, con las cosas menos ruidosas, como los moldes, verificar los tipos usando "es" y así. –
Aunque no puede hacer esto en C#, he escrito una serie de publicaciones en el blog sobre cómo hacer exactamente esto: http://www.simple-talk.com/community/blogs/simonc/archive/2010/07/14 /93495.aspx – thecoop