En C#, les membres statiques d'une superclasse sont "hérités" dans la portée des sous-classes. Par exemple, les membres statiques d'une superclasse sont "hérités" dans la portée des sous-classes :
class A { public static int M() { return 1; } }
class B : A {}
class C : A { public new static int M() { return 2; } }
[...]
A.M(); //returns 1
B.M(); //returns 1 - this is equivalent to A.M()
C.M(); //returns 2 - this is not equivalent to A.M()
Vous ne pouvez pas hériter de classes statiques, et le seul endroit où je peux imaginer que l'héritage statique pourrait avoir de l'importance l'ignore complètement : bien que vous puissiez créer une contrainte générique qui exige un paramètre de type T
pour être une sous-classe de A
vous ne pouvez toujours pas appeler T.M()
(ce qui simplifie probablement les choses pour la VM), sans parler de l'écriture d'un M
dans une sous-classe et l'utiliser.
Ainsi, l'"héritage" des membres statiques ressemble simplement à une pollution de l'espace de noms ; même si vous qualifiez explicitement le nom (c.-à-d. B.M
) A
est toujours résolue.
Editer comparer avec les espaces de noms :
namespace N1{ class X(); }
namespace N1.N2 { class X(); }
namespace N1.N2.N3 { [...] }
A l'intérieur N1.N2.N3
Il est logique que si j'utilise X
sans qualification, il s'agit de N1.N2.X
. Mais si je me réfère explicitement à N1.N2.N3.X
- et qu'une telle classe n'existe pas - je ne m'attends pas à ce qu'il trouve N2
et le compilateur signale d'ailleurs une erreur si vous essayez de le faire. En revanche, si je fais explicitement référence à B.M()
Pourquoi le compilateur ne signale-t-il pas d'erreur ? Après tout, il n'y a pas de méthode "M" dans "B"...
Quel est l'objectif de cet héritage ? Cette caractéristique peut-elle être utilisée de manière constructive d'une manière ou d'une autre ?