Поделиться через


Использование ключевых слов "Override" и "New" (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

В C# методы в производных классах могут иметь такие же имена, как и методы в базовых классах (если четко соблюдаются различия в использовании новых методов). В следующем примере демонстрируется использование ключевых слов new и override.

Сначала объявим три класса: базовый класс Car и два класса, производных от него: ConvertibleCar и Minivan. Базовый класс содержит один метод с именем DescribeCar, отправляющий описание автомобиля на консоль. Методы производных классов также включают метод с именем DescribeCar, отображающий уникальные свойства этих классов. Эти методы также вызывают базовый класс DescribeCar, чтобы продемонстрировать, каким образом они унаследовали свойства класса Car.

Чтобы подчеркнуть разницу, класс ConvertibleCar определен с ключевым словом new, а класс Minivan — с ключевым словом 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.");
    }
}

Теперь можно написать код, описывающий экземпляры этих классов и вызовы методов, чтобы объекты могли себя описывать:

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("----------");
}

Как и предполагалось, результат выглядит следующим образом:

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------

Однако в следующем фрагменте кода мы объявляем массив объектов, производных от класса Car. В этом массиве могут храниться объекты Car, ConvertibleCar и Minivan. Массив объявляется следующим образом:

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

Затем можно использовать цикл foreach для посещения каждого объекта Car в машине и вызова метода DescribeCar:

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

Результат выполнения этого цикла выглядит следующим образом:

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.

----------

Обратите внимание, что описание ConvertibleCar не такое, как ожидалось. Поскольку ключевое слово new было использовано для определения этого метода, метод производного класса не вызван, вместо него вызван метод базового класса. Объект Minivan правильно вызывает переопределенный метод и выдает ожидаемый результат.

Чтобы принудительно выполнялось правило, согласно которому все классы, производные от Car, должны реализовать метод DescribeCar, нужно создать новый базовый класс, определяющий метод DescribeCar как abstract. Абстрактный метод содержит только подпись метода и не содержит никакого кода. Любые классы, производные от этого базового класса, должны предоставлять реализацию DescribeCar. Дополнительные сведения см. в разделе abstract.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Классы и структуры (Руководство по программированию в C#)

Практическое руководство. Управление версиями с помощью ключевых слов "Override" и "New" (Руководство по программированию в C#)