Использование статического элемента класса в производном типе?

Используя 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?

Ответ 1

Одно место, где может быть введено в заблуждение, - это когда статический метод является factory, например. класс WebRequest имеет метод factory Create, который позволяет записывать этот тип кода, если он доступен через производный класс.

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

Здесь request имеет тип FtpWebRequest, но он запутан, потому что похоже, что он был создан из HttpWebRequest (класс sibling), хотя метод Create фактически определен на WebRequest (базовый класс). Следующий код идентичен по смыслу, но более ясен:

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

В конечном итоге нет серьезной проблемы с доступом к статическому с помощью производного типа, но код часто становится яснее, не делая этого.

Ответ 2

B.SomethingStatic() делает утверждение, что SomethingStatic является членом B. Это неправда. SomethingStatic однозначно является членом A. Тот факт, что он был доступен для неквалифицированных членов B (как если бы он был членом B), является вопросом удобства. Тот факт, что он доступен, если он квалифицирован с помощью B, является ошибкой IMO.

Ответ 3

Это не предупреждение, обычно, просто предложение. Вы создаете зависимость от чего-то ненужного.

Предположим, что вы позже решили, что B не нужно наследовать A. Если вы будете следовать рекомендациям Resharper, вам не нужно будет изменять эту строку кода.

Ответ 4

Да, я тоже это видел, я всегда думал, что это просто предупреждает меня, потому что это не нужно. A.SomethingStatic(); будет делать то же самое.