Ho difficoltà a capire come funziona il polimorfismo quando si usano i farmaci generici. Per fare un esempio, ho definito il seguente programma:Per favore aiutami a capire il polimorfismo quando usi i farmaci generici in C#
public interface IMyInterface
{
void MyMethod();
}
public class MyClass : IMyInterface
{
public void MyMethod()
{
}
}
public class MyContainer<T> where T : IMyInterface
{
public IList<T> Contents;
}
posso poi fare questo, che funziona bene:
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
Ho molte classi che implementano MyInterface. Vorrei scrivere un metodo che può accettare tutti gli oggetti myContainer:
public void CallAllMethodsInContainer(MyContainer<IMyInterface> container)
{
foreach (IMyInterface myClass in container.Contents)
{
myClass.MyMethod();
}
}
Ora, vorrei chiamare questo metodo.
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
this.CallAllMethodsInContainer(container);
Che non ha funzionato. Sicuramente, poiché MyClass implementa IMyInterface, dovrei essere in grado di lanciarlo semplicemente?
MyContainer<IMyInterface> newContainer = (MyContainer<IMyInterface>)container;
Anche questo non ha funzionato. Posso sicuramente lanciare un normale MyClass a IMyInterface:
MyClass newClass = new MyClass();
IMyInterface myInterface = (IMyInterface)newClass;
Così, almeno non ho del tutto capito male quello. Non sono sicuro di come scriverò un metodo che accetti una raccolta generica di classi conformi alla stessa interfaccia.
Ho un piano per risolvere completamente questo problema, se necessario, ma preferirei farlo correttamente.
Grazie in anticipo.
Qui è dove la gente tira fuori parole spaventose come covarianza e controvarianza. – Greg
@Greg: Per quanto mi riguarda, mi sento come se la mia * comprensione * di questi concetti si sia concretizzata di recente a causa della pletora di domande come questa che sono apparse! –
I concetti sono buoni, ma i nomi sono spaventosi. :) – Greg