mars
2007
Quand on veut changer restreindre le type de retour dans la surcharge d’une métode (ou propriété (readonly)) ou dans le cas d’une implémentation d’une interface, ce n’est pas possible. C’est bien dommage mais c’est comme ça !
Prenons un exemple :
{
List<I2> Test { get; }
}
interface I2
{
}
class C1 : I1
{
private List<C2> _test;
public List<C2> Test
{
get { return _test; }
}
}
class C2 : I2
{
}
Ceci n’est pas possible car on a changé le type de retour de la propriété Test.
Une première idée serait d’implémenter la propriété de façon explicite et de pointer vers notre propriété. Pour faire ceci, il est possible d’utiliser la méthode ConvertAll comme le montrait récemment neo dans son blog :
{
get
{
return Test.ConvertAll<I2>(delegate(C2 c2)
{
return c2;
});
}
}
// un délégué anonyme pour faire plaisir à Cédric
Le gros défaut de cette méthode est que le ConvertAll crée une nouvelle instance. Cela implique deux choses :
– Si vous rajoutez un élément dans la propriété I1.Test, il sera ignoré.
–
bool b = (c1 as I1).Test == (c1 as I1).Test; // b = False !
Une solution simple pour résoudre le problème consiste à rendre l’interface générique:
{
List<TestPropertyType> Test { get; }
}
class C1 : I1<C2>
{
private List<C2> _test = new List<C2>();
public List<C2> Test
{
get { return _test; }
}
}