73 votes

Utiliser un membre statique d'une classe sur un type dérivé ?

En utilisant Resharper 4.1, je suis tombé sur cet avertissement intéressant : "Accès à un membre statique d'un type via un type dérivé". Voici un exemple de code où cela se produit :

class A {
    public static void SomethingStatic() {
       //[do that thing you do...]
    }
}

class B : A {
}

class SampleUsage {
    public static void Usage() {
        B.SomethingStatic(); // <-- Resharper warning occurs here
    }
}

Quelqu'un sait-il quels sont les problèmes (s'il y en a) lorsque l'on utilise les membres statiques de A via B ?

84voto

Greg Beech Points 55270

Un endroit où cela pourrait être trompeur est lorsque le statique est une méthode d'usine, par exemple la méthode WebRequest a une méthode d'usine Create qui permettrait d'écrire ce type de code si on y accède via une classe dérivée.

var request = (FtpWebRequest)HttpWebRequest.Create("ftp://ftp.example.com");

Ici request est de type FtpWebRequest mais c'est déroutant car on dirait qu'il a été créé à partir d'une HttpWebRequest (une classe sœur) même si la classe Create est en fait définie sur WebRequest (la classe de base). Le code suivant est identique dans sa signification, mais il est plus clair :

var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");

En fin de compte, il n'y a pas de problème majeur à accéder à un statique via un type dérivé, mais le code est souvent plus clair en ne le faisant pas.

30voto

P Daddy Points 14228

B.SomethingStatic() fait la déclaration suivante SomethingStatic est un membre de B . Ce n'est pas vrai. SomethingStatic est sans équivoque un membre de A . Le fait qu'il soit accessible sans qualification aux membres du B (comme s'il s'agissait d'un membre de B ) est une question de commodité. Le fait qu'elle soit accessible lorsqu'elle est qualifiée par une balise B est, selon moi, une erreur.

15voto

Daniel Earwicker Points 63298

Ce n'est pas un avertissement, généralement, juste une suggestion. Vous créez inutilement une dépendance à quelque chose.

Supposons que vous décidiez plus tard que B n'a pas besoin d'hériter de A. Si vous suivez les conseils de Resharper, vous n'aurez pas besoin de modifier cette ligne de code.

2voto

Ray Points 22127

Oui, j'ai vu ça aussi, j'ai toujours pensé que c'était juste un avertissement parce que ce n'était pas nécessaire. A.SomethingStatic(); ferait la même chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X