web-dev-qa-db-ja.com

派生型でクラスの静的メンバーを使用しますか?

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の静的メンバーを利用するときに、何か問題がある場合は誰かが知っていますか?

73
Swim

誤解を招く可能性がある場所の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にアクセスすることには大きな問題はありませんが、そうしないことでコードが明確になることがよくあります。

84
Greg Beech

B.SomethingStatic()は、SomethingStaticBのメンバーであるというステートメントを作成します。本当じゃない。 SomethingStaticは、明らかにAのメンバーです。 Bのメンバーが(Bのメンバーであるかのように)資格なしでアクセスできるという事実は、便宜上の問題です。 Bで修飾されたときにアクセス可能であるという事実は、IMO、間違いです。

30
P Daddy

警告ではなく、通常は単なる提案です。不必要に何かへの依存関係を作成しています。

後でBがAを継承する必要がないと判断したとします。Resharperのアドバイスに従えば、そのコード行を変更する必要はありません。

15

ええ、私もこれを見たことがあります。それは不必要だったので、それが単に私に警告しているだけだといつも思っていました。 A.SomethingStatic();も同じことをします。

2
Ray