Betrachten Sie diese Implementierung:
public class MyClass<T1, T2> : IMyInterface<T1, T2>, IMyInterface<T2, T1>
{
/* implementation for IMyInterface<T1, T2> here. */
/* implementation for IMyInterface<T2, T1> here. */
}
Was MyClass<int, int>
nicht implementiert? Es implementiert IMyInterface<int, int>
zweimal, weil und IMyInterface<T2, T1>
vereinheitlichen, wenn T1
und T2
gleich sind. Deshalb ist die Implementierung sowohl als auch IMyInterface<T2, T1>
in derselben Klasse nicht zulässig. Die gleiche Argumentation würde gelten, wenn Sie beispielsweise versuchen würden, IMyInterface<int, T1>
und IMyInterface<T2, double>
zu implementieren: Die Typausdrücke vereinheitlichen für T1 = double, T2 = int
.
Betrachten Sie diese Implementierung:
public class MyClass<T1, T2> : MyClassBase<T1, T2>, IMyInterface<T1, T2>
{
/* implementation for IMyInterface<T1, T2> here. */
}
public class MyClassBase<T1, T2> : IMyInterface<T2, T1>
{
/* implementation for IMyInterface<T2, T1> here. */
}
Was Sie getan haben, ist legen Sie eine Priorität auf IMyInterface<T1, T2>
über IMyInterface<T2, T1>
. Für den Fall, dass T1
und T2
gleich sind und Sie eine Instanz von MyClass<T1, T2>
haben, wird die IMyInterface<T1, T2>
Implementierung ausgewählt. Wenn Sie eine Instanz von MyBaseClass<T1, T2>
haben, wird die IMyInterface<T2, T1>
Implementierung ausgewählt.
Hier ist ein Spielzeug-Programm, das Ihnen die Verhaltensweisen zeigt. Beachten Sie insbesondere das Verhalten von a_as_i.M(0, 1)
und a_as_b.M(0, 1)
. Wenn Sie I<T2, T1>
explizit auf B<T1, T2>
implementieren würden (indem Sie den Methodennamen mit I<T2, T1>.
voranstellen), wäre es unmöglich, ihn mit der Kompilierzeitsyntax aufzurufen. Reflexion wäre notwendig.
interface I<T1, T2>
{
void M(T1 x, T2 y);
}
class A<T1, T2> : B<T1, T2>, I<T1, T2>
{
public void M(T1 x, T2 y)
{
Console.WriteLine("A: M({0}, {1})", x, y);
}
}
class B<T1, T2> : I<T2, T1>
{
public void M(T2 x, T1 y)
{
Console.WriteLine("B: M({0}, {1})", x, y);
}
}
class Program
{
static void Main(string[] args)
{
//Outputs "A: M(0, 1)"
var a = new A<int, int>();
a.M(0, 1);
//Outputs "B: M(0, 1)"
var b = new B<int, int>();
b.M(0, 1);
//Outputs "A: M(0, 1)" because I<T1, T2>
//takes precedence over I<T2, T1>
var a_as_i = a as I<int, int>;
a_as_i.M(0, 1);
//Outputs "B: M(0, 1)" despite being called on an instance of A
var a_as_b = a as B<int, int>;
a_as_b.M(0, 1);
Console.ReadLine();
}
}
kompiliert es, ohne die Methoden der Schnittstelle in MyClass zu implementieren? Wenn ja, haben Sie Ihre Antwort – Dhawalk