Почему считается, что метод скрывается, если родительский и дочерний класс имеют статический метод с одинаковым именем? - PullRequest
4 голосов
/ 25 мая 2011

Если вы объявляете иерархию наследования, в которой родительский и дочерний класс имеют статический метод с одинаковыми именем и параметрами *, Visual Studio выдаст предупреждение CS0108 :

Пример:

public class BaseClass
{
    public static void DoSomething()
    {
    }
}

public class SubClass : BaseClass
{
    public static void DoSomething()
    {
    }
}

: warning CS0108: 'SubClass.DoSomething()' hides inherited member 'BaseClass.DoSomething()'. Use the new keyword if hiding was intended.

Почему этот метод считается скрытым? Ни один из методов не участвует в иерархии наследования и может быть вызван только с использованием имени класса:

BaseClass.DoSomething();
SubClass.DoSomething();

или неквалифицирован в самом классе. В любом случае нет никакой двусмысленности в отношении того, какой метод вызывается (то есть нет «скрытия»).

* Интересно, что методы могут различаться по типу возвращаемого значения и по-прежнему генерировать одно и то же предупреждение. Однако если типы параметров метода различаются, предупреждение не генерируется.

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

Ответы [ 4 ]

3 голосов
/ 25 мая 2011

Почему этот метод считается сокрытым?Ни один из методов не участвует в иерархии наследования и может быть вызван только с использованием имени класса.

Это не так.Вы можете вызывать DoSomething из любого унаследованного имени класса:

public Class A
{
     public static void C() {...}
}

public Class B: A
{

}

B.C() // Valid call!

. Поэтому вы скрываете C (), если объявляете метод с той же сигнатурой в B.

Надеюсь, это поможет.

2 голосов
/ 25 мая 2011

Члены Подкласса не смогут получить доступ к DoSomething из BaseClass без явного указания имени класса. Таким образом, он фактически «скрыт» для членов подкласса, но все еще доступен.

Например:

public class SubClass : BaseClass
{
    public static void DoSomething()
    {
    }

    public static void DoSomethingElse()
    {
        DoSomething(); // Calls SubClass
        BaseClass.DoSomething(); // Calls BaseClass
    }
}
0 голосов
/ 25 мая 2011

Visual Studio и Филипп говорят, что это предупреждение, поэтому ваш код будет компилироваться и запускаться.

Тем не менее, CodeNaked прекрасно демонстрирует, почему оно скрыто. Этот код компилируется без выдачи ошибок или предупреждений. Благодаря «CodeNaked»

public class BaseClass {
    public virtual void DoSomething() {
    }
}

public class SubClass : BaseClass {
    public override void DoSomething() {

    }

    public void DoSomethingElse() {
        DoSomething(); // Calls SubClass
        base.DoSomething(); // Calls BaseClass
    }
}

EDIT: С кодом Трэвиса я могу сделать следующее:
BaseClass.DoSomething ();
SubClass.DoSomething (); * +1008 *

И все работает отлично. Дело в том, что вы можете спросить, почему SubClass наследуется от BaseClass, и оба реализуют одни и те же статические методы. На самом деле это не так, оба класса реализуют методы, которые могут быть совершенно разными, но иметь одинаковые имена. Это может привести к путанице.

0 голосов
/ 25 мая 2011

Это просто предупреждение.Компилятор просто хочет убедиться, что вы намеренно использовали одно и то же имя метода.

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