Ne peut pas implémenter l'interface membre parce qu'il n'a pas la correspondance de type de retour de la Liste<IInterface>
J'ai interfaces IChild
et IParent
. IParent
a un membre qui est un List<IChild>
.
Je souhaite avoir des classes qui implémentent IParent
où chaque classe a un membre qui met en œuvre IChild
:
public interface IChild
{
}
public interface IParent
{
List<IChild> a { get; set; }
}
public class ChildA : IChild
{
}
public class ChildB : IChild
{
}
public class ParentA : IParent
{
public List<ChildA> a { get; set; }
}
public class ParentB : IParent
{
public List<ChildB> a { get; set; }
}
Mais, ce code ne compilera pas. L'erreur est:
`MyApp.Data.ParentA` does not implement interface member `MyApp.Data.IParent.a`.
`MyApp.Data.ParentA.a` cannot implement `MyApp.Data.IParent.a` because it does not have
the matching return type of `System.Collections.Generic.List<MyApp.Data.IChild>`.
Il serait plus sage de déclarer votre
ensuite, il peut faire juste
vous avez raison, mais,
List
propriétés IList
s, ils seraient moins retrictive mais offre la même fonctionnalité. N'aide pas à la question.ensuite, il peut faire juste
IEnumerable
. Peut-être pas à l'exigenceIList
n'offre pas les mêmes fonctionnalités que List
.vous avez raison, mais,
IList
, ICollection
(thier readonly) ou IEnumerable
peut-être une petite promesse de faire qui ne satisfaire à l'exigence de niveau de fonctionnalité.
OriginalL'auteur Sergej Popov | 2012-08-14
Vous devez vous connecter pour publier un commentaire.
Faire IParent générique:
Pouvez-vous élaborer sur les raisons pour lesquelles la solution?
OriginalL'auteur Volma
Vous avez besoin d'avoir le rendement des classes d'un
List<IChild>
:List<ChildX>
ou à partir d'unList<IChild>
.Vous avez raison. Mon erreur. J'ai édité la réponse.
OriginalL'auteur Garrett Vlieger
La mise en œuvre ne peut que retourner la Liste de IChild comme suit:
OriginalL'auteur nabeelfarid
Une collection de
IChild
ne peut pas être implicitement converti à une collection de son enfant typeChanger le type de retour de
IParent.a
àList<ChildA>
OU modifier la déclaration de la propriété surParentA
etParentB
àpublic List<IChild> a { get; set; }
. Je vous recommande le dernier, je pense que c'est ce que vous êtes plus susceptibles d'aller pour.ParentA
etParentB
? L'un surIParent
est déjà unList<IChild>
.Oui, vous devrez modifier les déclarations sur votre mise en œuvre de classes.
OriginalL'auteur mclark1129
J'ai eu une demande similaire où j'ai eu deux méthodes différentes qui fonctionne sur deux classes différentes, mais avait la même logique pour les propriétés qui sont communes pour les deux classes.
j'ai donc pensé à utiliser l'héritage et des génériques pour cela d'écrire une méthode commune, j'ai été en mesure d'atteindre de la manière suivante.
Modèle Simple.
Modèle Complexe.
La commune de la logique métier et l'échantillon de l'invocation. La clé ici est d'utiliser la
where
clause de contraindre le type de comme lawhere T : IBanner
tout le chemin vers le bas jusqu'à la méthode que nous voulons qu'il soit commun.OriginalL'auteur Abdul Mateen Mohammed