Inheritance действительно скрывает методы?

Я получаю следующее предупреждение компилятора:

'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended.    Resources.NET\Resources\Class1.cs   123 20  Resources

для этого (очень упрощенного) кода:

public interface IFoo
{
    int GetType();
    string GetDisplayName();
}

public class Foo : IFoo
{
    public int GetType() { return 3; }   *** Warning: points to here (line 123)***
    public string GetDisplayName() { return "Foo"; }
}

Обратите внимание, что я не понимаю, почему функция GetDisplayName() НЕ получает предупреждение. Я явно чего-то не замечаю.

Я обошел Stack Overflow и погуглил эту ошибку, и кажется, что она применима к наследованию классов, а не к интерфейсам. Я действительно запутался, почему это было бы вызвано для интерфейса (который определяет его методы как виртуальные).

Заранее спасибо за понимание.

5 ответов

Решение

Метод GetType определен в классе System.Object, который является основным базовым классом всех классов Framework.

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

Я предлагаю вам переименовать метод в GetFooType или что-то еще, или явно реализовать свой интерфейс, чтобы избежать проблем во время выполнения.

Это относится к вашему методу сокрытия GetType от объекта, а не от вашего интерфейса. Так как ваш класс наследует объект и реализует IFoo и оба обеспечивают GetType метод, неявно реализуя интерфейс, вы будете скрывать GetType наследуется от объекта. Если вы все еще хотите, чтобы ваш интерфейсный метод вызывался GetType Вы можете реализовать это явно вместо Foo:

int IFoo.GetType()
{
    return 3;
}

Все типы в.NET являются производными от System.Object.

System.Object уже определяет метод с именем GetType. Если вы определяете другой метод "GetType" в своем классе и если кто-то создает объект вашего класса, он никогда не сможет вызвать метод GetType, доступный в System.Object. По этой причине вы получаете предупреждение о том, что GetType скрывает метод, определенный в System.Object. Вы не получаете это предупреждение для GetDisplayName, потому что System.Object(или в этом отношении любой родительский класс) не определяет этот метод.

Я бы порекомендовал вам изменить имя вашего метода на другое, так как обычно.NET-разработчики ожидают, что вызов метода GetType будет ссылаться на реализацию System.Object.

Это не жалуется на вашу реализацию интерфейса, а скорее на повторную реализацию GetType(), которая уже находится на "объекте" - от которого Foo автоматически наследует. "Объект" не имеет метода GetDisplayName и поэтому не вызывает претензий к этому. Попробуйте переименовать метод или добавить модификатор "new", если вы действительно хотите скрыть object.GetType(), хотя это не рекомендуется.

Класс System.Object уже имеет метод GetType()

Вы должны использовать ключевое слово new или override для решения этой проблемы.

Другие вопросы по тегам