Hello à tous,
je suis face à un truc que je comprend pas :
J'ai une classe mère abstraite et deux classes filles qui possèdent les deux une collection generique dont le type possède une contrainte. La classe mère comprend egalement une methode abstraite de creation de cette collection. Ce sont les classes filles qui implementent la construction de la collection generique.
la classe mère avec son constructeur protegé et la definition de la methode
de creation de la coll. générique.
les classes filles (leur seules differences est le type de la collection generique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public abstract class CSide : ISide { protected CSide() { this.CreateLink(); } protected abstract void CreateLink(); }
et enfin le type de la collection generique
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public class CLeft : CSide , ILeft { public ILink<ILeft> Link { get; private set; } public CLeft() : base(){} protected override void CreateLink() { Link = new CLink<ILeft>(); } } public class CRight: CSide , IRight { public ILink<IRight> Link { get; private set; } public CRight() : base(){} protected override void CreateLink() { Link = new CLink<IRight>(); } } {
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class CLink<T> : ILink<T> where T: ISide { private readonly HashSet<T> m_Connectors; public CLink() { m_Connectors = new HashSet<T>(); } }
Toute cette petite machinerie fonctionnait parfaitement avant que je extrait la contrainte de CLink dans ILink. Depuis cette instant, j ai une erreur :
L'interface qui posse problèmeTest method VerifyFunctionTest threw exception: System.TypeLoadException: GenericArguments[0], T, pour ILink`1[T]' ne respecte pas la contrainte du paramètre de type T..
Et au debug, plus moyen d'entrée dans les fonctions "CreateLink()" de creation implmenté dans les classes filles (polymorphisme). J' ai verifié, le type de l'objet est bien un de type fille.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public interface ILink<T> : ILink where T: ISide { ICollection<T> Connectors { get; } }
Si je laisse la contrainte uniquequement sur la classe et par sur l'interface, tout marche correctement.
Partager