действительно ли наследование скрывает методы?
-
18-09-2019 - |
Вопрос
Я получаю следующее предупреждение компилятора:
'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 и погуглил эту ошибку, и, похоже, она применима к наследованию классов, а не к интерфейсам.Я действительно сбит с толку, почему это было бы запущено для интерфейса (который определяет свои методы как виртуальные).
Заранее спасибо за понимание.
Решение
В Полученный тип метод определяется на Система.Объект класс, который является конечным базовым классом из всех классов Фреймворка.
Этот метод используется для получения Тип текущего экземпляра во время выполнения, и я думаю, что вы не собираетесь переопределять его (у вас есть возвращаемый тип int).
Я предлагаю вам переименовать метод в GetFooType или что-то еще, или реализовать свой интерфейс явно чтобы избежать проблем во время выполнения.
Другие советы
Это относится к вашему методу скрытия GetType
из объекта, а не из вашего интерфейса.Поскольку ваш класс наследует object и реализует IFoo
, и оба обеспечивают GetType
способ, посредством неявно реализуя интерфейс, вы скроете GetType
унаследованный от объекта.Если вы все еще хотите, чтобы был вызван ваш интерфейсный метод GetType
, вы можете реализовать это явно вместо этого в Foo
:
int IFoo.GetType()
{
return 3;
}
Все типы в .NET являются производными от System.Object.
Система.Объект уже определяет метод с именем GetType.Если вы определяете другой метод 'GetType' в своем классе, и если кто-то создает объект вашего класса, он никогда не сможет вызвать метод GetType, доступный System.Object.Именно по этой причине вы получаете предупреждение о том, что 'GetType' скрывает метод, определенный в System.Object.Вы не получаете это предупреждение для getDisplayName, потому что System.Объект (или, если на то пошло, любой родительский класс) не определяет этот метод.
Я бы порекомендовал вам изменить имя вашего метода на что-нибудь другое, как обычно .Разработчики NET ожидают, что вызов метода GetType будет ссылаться на System.Реализация объекта.
Это не жалобы на вашу реализацию интерфейса, а скорее на вашу повторную реализацию GetType(), которая уже есть в "object", от которого Foo автоматически наследует."Object" не имеет метода getDisplayName и поэтому не вызывает нареканий по этому поводу.Попробуйте переименовать метод или добавить модификатор "new", если вы действительно хотите скрыть объект.GetType() хотя это и не рекомендуется.
System.Класс Object уже имеет метод GetType()
вы должны использовать ключевое слово new или override для решения этой проблемы