Ao realizar uma refatoração, acabei criando um método como o exemplo abaixo. O tipo de dados foi alterado para simplificar.
Eu já tive uma declaração de atribuição como esta:
MyObject myVar = new MyObject();
Ele foi reformulado para isso por acidente:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
Isso foi resultado de um erro de recortar / colar da minha parte, mas a new
palavra - chave em private static new
é válida e compila.
Pergunta : O que a new
palavra - chave significa em uma assinatura de método? Presumo que seja algo introduzido no C # 3.0?
Como isso difere override
?
new
como um modificador em um método (ou outro membro de tipo) não é "algo introduzido no C # 3.0". Ele está lá desde a primeira versão do C #.Respostas:
Nova referência de palavra-chave do MSDN:
Referência MSDN
Aqui está um exemplo que encontrei na rede de um MVP da Microsoft que faz muito sentido: Link para o original
A substituição só pode ser usada em casos muito específicos. Do MSDN:
Portanto, a palavra-chave 'nova' é necessária para permitir que você 'substitua' métodos não virtuais e estáticos.
fonte
new
sobre o que se trata, mas acho que está literalmente lá apenas para facilitar a leitura - o compilador está simplesmente avisando que quando você chama o método da classe derivada do mesmo nome que base, você não obterá o método da classe base que pode acho ... é bizarro ... puramente para facilitar a leitura?IMyInterface
a implementação na classe Derivada será chamada. AssimIMyInterface c = new B()
, chamaremos a implementação da classe B. Se apenas uma classe implementar a interface, o método da classe que a implementa será chamado.Não, na verdade não é "novo" (desculpe o trocadilho). É basicamente usado para "esconder" um método. IE:
Se você fizer isso:
O método na Base é o que será chamado, NÃO o da derivada.
Mais algumas informações: http://www.akadia.com/services/dotnet_polymorphism.html
Re sua edição: No exemplo que dei, se você "substituir" em vez de usar "novo", então, quando você chamar b.Method (); o Método da classe Derivada seria chamado por causa do polimorfismo.
fonte
Como outros explicaram, ele é usado para ocultar um método existente. É útil para substituir um método que não seja virtual na classe pai.
Lembre-se de que criar um "novo" membro não é polimórfico. Se você converter o objeto para o tipo base, ele não usará o membro do tipo derivado.
Se você tem uma classe base:
E então a classe derivada:
Se você declarar um tipo de
DerivedType
e depois convertê-lo, o métodoDoSomething()
não é polimórfico, ele chamará o método da classe base, não o derivado.fonte
override
assinatura de métodonew
oculte o tipo base do tipo derivado, porque você não pode sempre acessar o tipo base usando abase.<type>
notação?base.<method>
e também pode ser chamado externamente se você converter para o tipo base em seu código. É tecnicamente mais preciso pensar nisso como "anulando" o método básico do que "ocultando-o".Dos documentos:
Se o método na classe derivada for precedido com a nova palavra-chave, o método será definido como independente do método na classe base.
O que isso significa na prática:
Se você herda de outra classe e tem um método que compartilha a mesma assinatura, você pode defini-lo como 'novo' para que seja independente da classe pai. Isso significa que se você tiver uma referência à classe 'pai', essa implementação será executada; se você tiver uma referência à classe filha, essa implementação será executada.
Pessoalmente, tento evitar a palavra-chave 'nova', pois normalmente significa que entendi errado minha hierarquia de classes, mas há momentos em que pode ser útil. Um lugar é para controle de versão e compatibilidade com versões anteriores.
Há muitas informações no MSDN para isso .
fonte
new
estar lá. É sintático / legível.Isso significa que o método substitui um método com o mesmo nome herdado da classe base. No seu caso, você provavelmente não tem um método com esse nome na classe base, o que significa que a nova palavra-chave é totalmente supérflua.
fonte
Resumindo a história - NÃO é necessário, NÃO muda NENHUM comportamento e está PURAMENTE lá para facilitar a leitura.
É por isso que no VS você verá um pouco distorcido, mas seu código será compilado e executado perfeitamente e conforme o esperado.
É preciso perguntar se realmente valeu a pena criar a
new
palavra - chave quando tudo o que ela significa é o reconhecimento do desenvolvedor "Sim, eu sei que estou escondendo um método básico, sim, eu sei que não estou fazendo nada relacionado avirtual
ouoverriden
(polimorfismo) - Eu realmente quero apenas criar seu próprio método ".É um pouco bizarro para mim, mas talvez apenas porque venho de um
Java
background e há essa diferença fundamental entreC#
herança eJava
: EmJava
, os métodos são virtuais por padrão, a menos que sejam especificados porfinal
. EmC#
, os métodos são finais / concretos por padrão, a menos que especificado porvirtual
.fonte
Do MSDN :
fonte
Tenha cuidado com isso.
Você tem um método definido em uma interface que é implementada em uma classe base. Em seguida, você cria uma classe derivada que oculta o método da interface, mas não declara especificamente a classe derivada como implementando a interface. Se você chamar o método por meio de uma referência à interface, o método da classe base será chamado. No entanto, se sua classe derivada implementar especificamente a interface, seu método será chamado de qualquer tipo de referência usado.
fonte