propiedades - que es override en c#
¿Usar el miembro estático de una clase en un tipo derivado? (4)
Usando Resharper 4.1, me encontré con esta advertencia interesante: "Acceso a un miembro estático de un tipo a través de un tipo derivado". Aquí hay una muestra de código de dónde ocurre esto:
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
}
}
¿Alguien sabe qué problemas hay (si hay alguno) al hacer uso de los miembros estáticos de A a través de B?
No es una advertencia, por lo general, solo una sugerencia. Estás creando una dependencia en algo innecesariamente.
Supongamos que luego decide que B no necesita heredar A. Si sigue los consejos de Resharper, no necesitará modificar esa línea de código.
Sí, he visto esto también, siempre he supuesto que solo me estaba advirtiendo porque era innecesario. A.SomethingStatic();
haría lo mismo
Un lugar donde podría ser engañoso es cuando la estática es un método de fábrica, por ejemplo, la clase WebRequest
tiene un método de fábrica Create
que permitiría escribir este tipo de código si se accede a través de una clase derivada.
var request = (FtpWebRequest)HttpWebRequest.Create("ftp://ftp.example.com");
Aquí la request
es de tipo FtpWebRequest
pero es confusa porque parece que se creó a partir de una HttpWebRequest
(una clase de hermanos) aunque el método Create
realidad está definido en WebRequest
(la clase base). El siguiente código es idéntico en significado, pero es más claro:
var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");
En última instancia, no hay un gran problema para acceder a una estática a través de un tipo derivado, pero el código a menudo es más claro al no hacerlo.
B.SomethingStatic()
hace la afirmación de que SomethingStatic
es miembro de B
Esto no es verdad. SomethingStatic
es inequívocamente un miembro de A
El hecho de que se puede acceder sin reservas a los miembros de B
(como si fuera un miembro de B
) es una cuestión de conveniencia. El hecho de que es accesible cuando está calificado con B
es, IMO, un error.