Faz Herança realmente esconder métodos?
-
18-09-2019 - |
Pergunta
Estou recebendo o seguinte aviso do compilador:
'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended. Resources.NET\Resources\Class1.cs 123 20 Resources
para este código (muito simplificado):
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"; }
}
Note, o que eu não entendo é por que a função GetDisplayName () não recebe um aviso. Estou com vista claramente algo.
Eu picado em torno de estouro de pilha e pesquisei este erro e parece aplicar-se a herança de classe, não interfaces. Estou realmente confuso por que isso seria acionado para a interface (que define os seus métodos como virtual).
Agradecemos antecipadamente para o insight.
Solução
O método GetType é definida na System.Object classe, que é a classe base de todas as classes do quadro.
Este método é usado para obter o Digite de a instância atual em tempo de execução, e eu acho que você não está com a intenção de substituí-lo (você tem um tipo int retorno).
Eu sugiro que você mudar o nome do método para GetFooType ou outra coisa, ou implementar a interface explicitamente a problemas de evitar tempo de execução.
Outras dicas
Trata-se de seu esconderijo método GetType
do objeto, e não a partir de sua interface. Desde seus herda classe de objeto e implementos IFoo
, e ambos fornecem um método GetType
, pela implicitamente que implementa a interface que você irá esconder o GetType
herdado do objeto. Se você ainda quer que seu método de interface para ser chamado GetType
, você pode implementá-lo explicitamente em vez de Foo
:
int IFoo.GetType()
{
return 3;
}
Todos os tipos do .NET derivam de System.Object.
System.Object já define um método chamado GetType. Se você definir outro método 'GetType' em sua classe e se alguém cria um objeto de sua classe, eles nunca pode chamar o método GetType disponibilizados por System.Object. Esta é a razão que você está recebendo o aviso de que os couros 'GetType' O método definido no System.Object. Você não receber este aviso para GetDisplayName porque System.Object (ou para essa matéria qualquer classe pai) não define este método.
Eu recomendo que você mudar o seu nome de método para outra coisa como geralmente desenvolvedores .NET esperar GetType chamada de método para se referir a implementação System.Object.
Não reclamando sobre a sua implementação da interface, mas sim a sua reimplementação de GetType () que já está no "objeto" - a partir do qual Foo herda automaticamente. "Objeto" não tem um método GetDisplayName e, portanto, não levanta qualquer queixa por isso. Tente mudar o nome do método ou adicionar no "novo" modificador se você realmente deseja que ele não é recomendado hide Object.GetType ().
classe System.Object já tem o método GetType ()
você deve usar a palavra-chave novo ou de substituição para resolver este problema