在派生类型上使用类的静态成员?

使用 Resharper 4.1,我遇到了这个有趣的警告: “通过派生类型访问类型的静态成员”。下面是发生这种情况的代码示例:

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
}
}

有没有人知道通过 B 使用 A 的静态成员有什么问题(如果有的话) ?

13700 次浏览

这通常不是一个警告,只是一个建议。你正在创造一个不必要的依赖。

假设你后来决定 B 不需要继承 A。如果您遵循 Resharper 的建议,就不需要修改那行代码。

是的,我也看到了,我一直以为这只是在警告我,因为这是没有必要的。A.SomethingStatic();也会这么做。

当静态方法是一个工厂方法时,可能会产生误导,例如,WebRequest类有一个工厂方法 Create,如果通过派生类访问,它允许编写这种类型的代码。

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

这里的 requestFtpWebRequest类型的,但是它令人困惑,因为它看起来像是从 HttpWebRequest(一个兄弟类)创建的,尽管 Create方法实际上是在 WebRequest(基类)上定义的。以下代码的含义相同,但更清楚:

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

最终,通过派生类型访问静态并没有什么大问题,但是不这样做的代码通常更清晰。

B.SomethingStatic()声明 SomethingStaticB的成员。这不是真的。SomethingStatic毫无疑问是 A的一员。B的成员无法访问它(就好像它是 B的成员一样) ,这是一个方便的问题。事实上,这是可以访问的时候,一个 B的资格是,我,一个错误。