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の静的メンバーを利用するときに、何か問題がある場合は誰かが知っていますか?
誤解を招く可能性がある場所の1つは、スタティックがファクトリメソッドである場合です。 WebRequest
クラスにはファクトリメソッドCreate
があり、派生クラスを介してアクセスした場合にこのタイプのコードを記述できます。
var request = (FtpWebRequest)HttpWebRequest.Create("ftp://ftp.example.com");
ここで、request
のタイプはFtpWebRequest
ですが、HttpWebRequest
メソッドが実際にはCreate
(基本クラス)で定義されているにもかかわらず、WebRequest
(兄弟クラス)から作成されたように見えるため、混乱します。次のコードは意味が同じですが、より明確です。
var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");
結局のところ、派生型を介してstaticにアクセスすることには大きな問題はありませんが、そうしないことでコードが明確になることがよくあります。
B.SomethingStatic()
は、SomethingStatic
がB
のメンバーであるというステートメントを作成します。本当じゃない。 SomethingStatic
は、明らかにA
のメンバーです。 B
のメンバーが(B
のメンバーであるかのように)資格なしでアクセスできるという事実は、便宜上の問題です。 B
で修飾されたときにアクセス可能であるという事実は、IMO、間違いです。
警告ではなく、通常は単なる提案です。不必要に何かへの依存関係を作成しています。
後でBがAを継承する必要がないと判断したとします。Resharperのアドバイスに従えば、そのコード行を変更する必要はありません。
ええ、私もこれを見たことがあります。それは不必要だったので、それが単に私に警告しているだけだといつも思っていました。 A.SomethingStatic();
も同じことをします。