Использование статического члена класса в производном типе? - PullRequest
73 голосов
/ 19 марта 2009

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

Кто-нибудь знает, какие проблемы возникают (если есть) при использовании статических членов A через B?

Ответы [ 4 ]

84 голосов
/ 19 марта 2009

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

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

30 голосов
/ 19 марта 2009

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

15 голосов
/ 19 марта 2009

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

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

2 голосов
/ 19 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...