Versão com o substituição e palavras-chave new (guia de programação C#) 

linguagem translation from VPE for Csharp foi projetado para que o controle de versão entre base e as classes derivadas bibliotecas diferentes podem evoluir e manter a compatibilidade com versões anteriores.Isso significa que, por exemplo, que a introdução de um novo membro em uma base classe com o mesmo nome sistema autônomo um membro em uma classe derivada é completamente suportado pelo translation from VPE for Csharp e não levar a um comportamento inesperado.Isso também significa que uma classe deve declarar explicitamente se um método se destina a substituir um método herdado ou se um método é um novo método que oculte um nome semelhante método herdado.

Em translation from VPE for Csharp, classes derivadas podem conter métodos com o mesmo nome de métodos da classe base.

  • O método da classe base deve ser definido virtual.

  • Se o método na classe derivada não for precedido por novo or Substituir palavras-chave, o compilador emitirá um aviso e o método irá se comportam sistema autônomo se o new palavra-chave estavam presentes.

  • Se o método na classe derivada é precedido de new palavra-chave, o método é definido sistema autônomo sendo independente do método na classe base.

  • Se o método na classe derivada é precedido de override palavra-chave, objetos derivados da classe irão chamar esse método em vez do método de classe base.

  • O método da classe base pode ser chamado a partir da classe derivada usando o base palavra-chave.

  • The override, virtual, e new palavras-chave também podem ser aplicadas a propriedades, indexadores e eventos.

Por padrão, translation from VPE for Csharp métodos não são virtual.Se um método é declarado sistema autônomo virtual, qualquer classe que herda o método pode implementar sua própria versão.Para tornar um método virtual, a virtual modificador é usado na declaração do método da classe base. A classe derivada, em seguida, pode substituir o método base virtual usando o override palavra-chave ou ocultar o método virtual na classe base, usando o new palavra-chave. Se nem o override palavra-chave nem a new palavra-chave for especificado, o compilador emitirá um aviso e o método na classe derivada ocultará o método na classe base. Para obter mais informações, consulte Compilador CS0108 de aviso (nível 2).

Para demonstrar isso na sessão prática, assumir por um momento que a empresa criou uma classe chamada GraphicsClass, que usa o seu programa. A seguir é GraphicsClass:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
}

Sua empresa usa essa classe, e você usá-lo para derivar sua própria classe, adicionando um novo método:

class YourDerivedGraphicsClass : GraphicsClass
{
    public void DrawRectangle() { }
}

Seu aplicativo é usado sem problemas, até que a empresa lança uma nova versão de GraphicsClass, que se parece com o código a seguir:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
    public virtual void DrawRectangle() { }
}

A nova versão do GraphicsClass agora contém um método chamado DrawRectangle. Inicialmente, nada ocorre.A nova versão é ainda binário compatível com a versão antiga.Qualquer software que tenha implantado o continuará a funcionar, mesmo se a nova classe estiver instalada nesses sistemas de computador.As chamadas existentes para o método DrawRectangle continuará a referência a versão, em sua classe derivada.

No entanto, sistema autônomo logo sistema autônomo recompilar seu aplicativo usando a nova versão do GraphicsClass, você receberá um aviso do compilador. Para obter mais informações, consulte Compilador CS0108 de aviso (nível 2).

Este aviso informa que você deve considerar como você deseja que o seu DrawRectangle método para se comportar em seu aplicativo.

Se desejar que seu método para substituir o novo método de classe base, use o override palavra-chave:

class YourDerivedGraphicsClass : GraphicsClass
{
    public override void DrawRectangle() { }
}

The override palavra-chave certifica-se de que qualquer objeto derivado de YourDerivedGraphicsClass usará a versão de classe derivada de DrawRectangle. Objetos derivados de YourDerivedGraphicsClass ainda pode acessar a versão de classe base do DrawRectangle usando a palavra-chave base:

base.DrawRectangle();

Se você não quiser que seu método para substituir o novo método de classe base, as seguintes considerações se aplicam.Para evitar confusão entre os dois métodos, você pode renomear seu método.Isso pode ser demorado e sujeito a erros e simplesmente não for prático em alguns casos.No entanto, se o projeto for relativamente pequeno, você pode usar opções Refactoring Visual Studio é para renomear o método.Para obter mais informações, consulte Classes e tipos de refatoração.

Como alternativa, você pode impedir que o aviso usando a palavra-chave new em sua definição de classe derivada:

class YourDerivedGraphicsClass : GraphicsClass
{
    public new void DrawRectangle() { }
}

Usando o new palavra-chave informa ao compilador que sua definição oculta a definição que está contida na classe base. Esse é o comportamento padrão.

Substituição e método Selection

Quando um método é denominado em uma classe, o compilador C# seleciona o melhor método para chamar se mais de um método é compatível com a chamada, como quando não houver dois métodos com o mesmo nome, e parâmetros que são compatíveis com o parâmetro passado.Os métodos a seguir deve ser compatíveis:

public class Derived : Base
{
    public override void DoWork(int param) { }
    public void DoWork(double param) { }
}

Quando DoWork for chamado em uma instância do Derived, o compilador C# primeiro tenta tornar a chamada compatível com as versões do DoWork declarado originalmente no Derived.Métodos de substituição não são considerados como declarado em uma classe, eles são novas implementações de um método declarado em uma classe base.Somente se o compilador C# não pode corresponder a chamada método para um método original nele Derived tentará corresponder a chamada para um método substituído com o mesmo nome e parâmetros compatíveis.Por exemplo:

int val = 5;
Derived d = new Derived();
d.DoWork(val);  // Calls DoWork(double).

Porque a variável val pode ser convertida em um double implicitamente, o compilador C# chama DoWork(double) em vez de DoWork(int).Há duas maneiras para evitar isso.Primeiro, evite declarar novos métodos com o mesmo nome como métodos virtuais.Segundo, você pode instruir o compilador C# para chamar o método virtual tornando-localizar na lista método classe base por projetando a instância do Derived para Base.Porque o método é virtual, a implementação de DoWork(int) em Derived será chamada.Por exemplo:

((Base)d).DoWork(val);  // Calls DoWork(int) on Derived.

Consulte também

Conceitos

Guia de Programação C#

Referência

Classes e estruturas (guia de programação translation from VPE for Csharp)

Métodos (Guia de programação do C#)

Herança (Guia de programação C#)