j'ai le code suivant écrit en C# en utilisant des interfaces, l'héritage et génériques:C# génériques covariance et contravariance conflit
public interface IBasic
{
}
public class Basic : IBasic
{
}
public class AnotherBasic : Basic
{
}
public interface IWorker<in TBasic>
{
void Run(TBasic basic);
}
public class Worker : IWorker<Basic>
{
public void Run(Basic basic)
{
throw new System.NotImplementedException();
}
}
public class AnotherWorker : IWorker<AnotherBasic>
{
public void Run(AnotherBasic basic)
{
throw new System.NotImplementedException();
}
}
public void Test()
{
List<IWorker<IBasic>> workers = new List<IWorker<IBasic>>
{
new Worker(),
new AnotherWorker()
};
}
Le problème de ce code est que les classes ouvrières et anotherworker ne correspondent pas aux génériques liste des IWorker<IBasic>
qui sont les parents des travailleurs tant pour le travailleur que pour la classe de base. La chose est que IWorker<in TBasic>
est contravariant en raison de la signature de la méthode d'exécution, mais j'ai besoin de covariant, afin de remplir le List<IWorker<IBasic>>
. La méthode d'exécution doit avoir le paramètre TBasic, et j'ai besoin de cette liste de travailleurs à des fins de modèle de conception de la chaîne de responsabilité. Est-ce que je manque quelque chose ou ai-je trouvé une raison de faire de la covariance et de la contravariance non mutuellement exclusives?
Vous ne pouvez pas le faire car il ne serait pas sûr, par ex.'new List> {new AnotherWorker()} [0] .Run (new Basic())' compile mais échoue lors de l'exécution. –
Lee
Cela ressemble à un [XYProblem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Tout problème que vous essayez de résoudre avec cette conception peut probablement être résolu avec un design différent si vous décrivez le problème réel que vous essayez de résoudre. – juharr
Je peux évidemment résoudre cela avec le nombre d'approches, mais je veux que cela fonctionne comme je le montre –