Mis à part le fait que A.MyMethod
est statique, ce qui clairement fonctionnera pas car rien statique ne prend pas part à l'héritage, même si vous l'avez fait pas statique, il ne fonctionne toujours pas. Par exemple, cela ne fonctionnera pas non plus:
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
}
}
Pourquoi?
Vous dites where T : A
ce qui signifie que le type T
doit être un type dérivé de A
. Votre classe B<T
n'est pas un type dérivé de A
, donc la ligne 1 ne fonctionnera pas.
Mais pourquoi la ligne 2 ne fonctionne-t-elle pas?
T
est un type et si T
est héritant A
, les objets de type T
seront en mesure de le faire. Si vous avez changé comme ça, il fonctionnera:
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);
}
}
Dans le code ci-dessus, C
dérive A
qui était votre restriction. Puis BClosed
ferme le type générique en disant T
est C
alors maintenant vous pouvez appeler MyMethod
de A
et AnotherMethod
de votre générique.
De même, lorsque vous avez une classe générique, vous devez utiliser le type générique sinon je ne vois pas l'utilisation. Donc, cela est inutile car il n'a pas de code générique:
public class B<T> where T : A {
public void AnotherMethod() {
}
}
En C#, les appels de méthodes statiques sont toujours résolus statiquement, au moment de la compilation. Les méthodes statiques ne participent pas à l'héritage. – recursive
Pourquoi pas 'var S2 = A.MonMethod();', puisque vous connaissez 'A' ci-dessus? –
'base.MyMethod() 'ne fonctionnerait jamais parce que B n'hérite pas de A, il a un paramètre de type qui est restreint à une implémentation de A, où le commentaire de récursif arrive. – Phaeze