Использование статического элемента класса в производном типе?
Используя 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();
будет делать то же самое.