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

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

72 голоса | спросил Swim 19 MaramThu, 19 Mar 2009 00:13:32 +03002009-03-19T00:13:32+03:0012 2009, 00:13:32

4 ответа


0

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

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

ответил Greg Beech 19 MaramThu, 19 Mar 2009 00:23:15 +03002009-03-19T00:23:15+03:0012 2009, 00:23:15
0

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

ответил P Daddy 19 MaramThu, 19 Mar 2009 01:05:51 +03002009-03-19T01:05:51+03:0001 2009, 01:05:51
0

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

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

ответил Daniel Earwicker 19 MaramThu, 19 Mar 2009 00:17:28 +03002009-03-19T00:17:28+03:0012 2009, 00:17:28
0

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

ответил Ray 19 MaramThu, 19 Mar 2009 00:18:40 +03002009-03-19T00:18:40+03:0012 2009, 00:18:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132