Compartilhar via


Saber quando usar substituição e Novo palavras-chave (guia de programação C#)

C# permite que os métodos em classes derivadas para ter o mesmo nome como métodos em classes base — desde que você está muito específico sobre como o novo método deve ser tratado. O exemplo a seguir demonstra o uso da nova e Substituir palavras-chave.

Primeiro, podemos declarar três classes: um base classe chamada Care duas classes que derivam, ConvertibleCar e Minivan. A classe base contém um único método, DescribeCar, que envia uma descrição do carro ao console. Os métodos de classe derivada também incluem um método chamado DescribeCar, que exibe suas propriedades exclusivas. Esses métodos também chamam a classe base DescribeCar método para demonstrar como eles têm herdadas as propriedades da Car classe.

Para destacar a diferença, o ConvertibleCar classe é definida com o new palavra-chave, enquanto o Minivan classe é definida com override.

// Define the base class
class Car
{
    public virtual void DescribeCar()
    {
        System.Console.WriteLine("Four wheels and an engine.");
    }
}

// Define the derived classes
class ConvertibleCar : Car
{
    public new virtual void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("A roof that opens up.");
    }
}

class Minivan : Car
{
    public override void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("Carries seven people.");
    }
}

Agora podemos escrever algum código que declara ocorrências dessas classes e chama seus métodos para que os objetos podem descrever a mesmos:

public static void TestCars1()
{
    Car car1 = new Car();
    car1.DescribeCar();
    System.Console.WriteLine("----------");

    ConvertibleCar car2 = new ConvertibleCar();
    car2.DescribeCar();
    System.Console.WriteLine("----------");

    Minivan car3 = new Minivan();
    car3.DescribeCar();
    System.Console.WriteLine("----------");
}

Como você poderia esperar, a saída terá esta aparência:

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------

No entanto, na próxima seção do código, podemos declarar uma matriz de objetos derivada de Car classe de base. Essa matriz pode armazenar Car, ConvertibleCar, e Minivan objetos. A matriz é declarado como este:

public static void TestCars2()
{
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
}

Podemos usar um foreach para visitar cada loop Car objeto contido na matriz e chamada a DescribeCar método, como este:

foreach (Car vehicle in cars)
{
    System.Console.WriteLine("Car object: " + vehicle.GetType());
    vehicle.DescribeCar();
    System.Console.WriteLine("----------");
}

A saída desse loop é o seguinte:

Car object: YourApplication.Car

Four wheels and an engine.

----------

Car object: YourApplication.ConvertibleCar

Four wheels and an engine.

----------

Car object: YourApplication.Minivan

Four wheels and an engine.

Carries seven people.

----------

Observe como o ConvertibleCar descrição é não o que você esperava. Como o new palavra-chave foi usado para definir esse método, o método de classe derivada não é chamado — o método de classe base é chamado em vez disso. O Minivan objeto corretamente chama o método substituído, estamos produzindo os resultados esperados.

Se você deseja aplicar uma regra a todas as classes derivadas de Car deve implementar a DescribeCar método, você deve criar uma nova classe base que define o método DescribeCar como abstract. Um método abstrato não contém qualquer código, a assinatura de método. As classes derivadas dessa classe base devem fornecer uma implementação de DescribeCar. Para obter mais informações, consulte abstrata.

Consulte também

Referência

Classes e estruturas (guia de programação de C#)

Versioning with the Override and New Keywords (C# Programming Guide)

Conceitos

C# Programming Guide