在派生types上使用类的静态成员?
使用Resharper 4.1,我遇到了这个有趣的警告:“通过派生types访问types的静态成员”。 以下是发生这种情况的代码示例:
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的静态成员知道有什么问题(如果有的话)吗?
一个地方,它可能会误导静态是一个工厂方法,例如WebRequest
类有一个工厂方法Create
,这将允许这种types的代码,如果通过派生类访问被写入。
var request = (FtpWebRequest)HttpWebRequest.Create("ftp://ftp.example.com");
这里request
的types是FtpWebRequest
但是它很混乱,因为它看起来像是从HttpWebRequest
(同级类) Create
即使Create
方法实际上是在WebRequest
(基类)上定义的。 以下代码意义相同,但更清晰:
var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");
最终,通过派生types访问静态代码没有什么大问题,但是代码通常不是很清楚。
B.SomethingStatic()
声明SomethingStatic
是B
的成员。 这不是真的。 SomethingStatic
明确地是A
的成员。 B
成员无法取得资格的情况(就好像它是B
的成员一样)是方便的。 事实上,如果有资格获得B
,IMO就是一个错误。
这不是一个警告,通常只是一个build议。 你正在创build一个不必要的依赖。
假设你以后决定B不需要inheritanceA.如果你遵循了Resharper的build议,你将不需要修改那行代码。
是的,我也看到了,我一直认为这只是警告我,因为这是没有必要的。 A.SomethingStatic();
会做同样的事情。