Наследование действительно скрывает методы? - PullRequest
1 голос
/ 20 июля 2009

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

'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 ]

10 голосов
/ 20 июля 2009

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

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

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

4 голосов
/ 20 июля 2009

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

int IFoo.GetType()
{
    return 3;
}
3 голосов
/ 20 июля 2009

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

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

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

2 голосов
/ 20 июля 2009

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

0 голосов
/ 20 июля 2009

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

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

...