Ich habe ein Problem zu verstehen, wie Polymorphie funktioniert bei der Verwendung von Generika. Als Beispiel habe ich das folgende Programm definiert:Bitte helfen Sie mir zu verstehen, Polymorphismus bei der Verwendung von Generika 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;
}
Ich kann dies dann tun, was ganz gut funktioniert:
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
ich viele Klassen, die MyInterface implementieren. Ich möchte eine Methode schreiben, die alle MyContainer Objekte annehmen können:
public void CallAllMethodsInContainer(MyContainer<IMyInterface> container)
{
foreach (IMyInterface myClass in container.Contents)
{
myClass.MyMethod();
}
}
Nun, ich möchte diese Methode nennen.
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
this.CallAllMethodsInContainer(container);
Das hat nicht funktioniert. Da MyClass IMyInterface implementiert, sollte ich es einfach umsetzen können?
Das hat auch nicht funktioniert. Ich kann auf jeden Fall eine normale MyClass IMyInterface Stimmen:
MyClass newClass = new MyClass();
IMyInterface myInterface = (IMyInterface)newClass;
So zumindest habe ich nicht ganz, dass falsch verstanden. Ich bin mir nicht ganz sicher, wie ich eine Methode schreiben soll, die eine generische Sammlung von Klassen akzeptiert, die der gleichen Schnittstelle entsprechen.
Ich habe einen Plan, um dieses Problem vollständig zu hacken, wenn es sein muss, aber ich würde es wirklich vorziehen, es richtig zu machen.
Vielen Dank im Voraus.
Hier trotzen die Leute gruselige Wörter wie Kovarianz und Kontravarianz. – Greg
@Greg: Auf der positiven Seite, ich habe das Gefühl, dass mein * eigenes * Verständnis dieser Konzepte in letzter Zeit aufgrund der Fülle von Fragen wie dieser, die aufgetaucht sind, wirklich konkretisiert wurde! –
Die Konzepte sind gut, aber die Namen sind gruselig. :) – Greg