Abgesehen von der Tatsache, dass A.MyMethod
statisch ist, die bei der Vererbung teilnehmen statisch, da irgendetwas nicht eindeutig nicht funktioniert, auch wenn Sie es noch nicht funktionieren wird es nicht statisch gemacht. Zum Beispiel wird dies entweder nicht:
public abstract class A {
public string MyMethod() {
return "a";
}
}
public class B<T> where T : A {
public void AnotherMethod() {
var S1 = base.MyMethod(); // Line 1
var S2 = T.MyMethod(); // Line 2
}
}
Warum?
Sie where T : A
sagen, die diese Art bedeutet T
hat eine abgeleitete Art von A
sein. Ihre Klasse B<T
ist kein abgeleiteter Typ von A
, daher funktioniert Zeile 1 nicht.
Aber warum funktioniert Zeile 2 nicht?
T
ist ein Typ und wenn T
A
ist vererben, dann Objekte vom Typ T
wird, das tun können. Wenn Sie es wie folgt geändert, dann wird es funktionieren:
public abstract class A {
public string MyMethod() {
return "a";
}
}
public class B<T> where T : A {
public void AnotherMethod(T t) {
t.MyMethod();
}
}
public class C : A {
}
public class BClosed : B<C> {
public void Foo(C c) {
c.MyMethod();
this.AnotherMethod(c);
}
}
In dem obigen Code, C
A
die Ihre Einschränkung war ableitet. Dann BClosed
schließt die generische Art sagen T
ist C
so können Sie jetzt MyMethod
von A
und AnotherMethod
Ihrer generischen anrufen.
Wenn Sie eine generische Klasse haben, sollten Sie den generischen Typ verwenden, sonst sehe ich die Verwendung nicht. Das ist nutzlos, da es keinen generischen Code enthält:
In C# werden statische Methodenaufrufe immer statisch zur Kompilierungszeit aufgelöst. Statische Methoden sind nicht an der Vererbung beteiligt. – recursive
Warum nicht 'var S2 = A.MyMethod();', da Sie 'A' oben wissen? –
'Basis.MyMethod() 'würde nie funktionieren, weil B nicht A erbt, es hat einen Typparameter, der auf eine Implementierung von A beschränkt ist, wo der Kommentar von recursive kommt. – Phaeze