logo
CSharp_Prog_Guide

Переопределение и выбор метода29

При вызове метода класса компилятор C# выбирает наилучший из методов, совместимых с вызовом (например, если имеются два метода с одинаковыми именами), и параметров, которые совместимы с переданным параметром. Следующие методы будут совместимы:

public class Derived : Base

{

public override void DoWork(int param) { }

public void DoWork(double param) { }

}

Если выполняется вызов DoWork из экземпляра Derived, компилятор C# сначала попытается обеспечить совместимость вызова с версиями DoWork, первоначально объявленными в Derived. Переназначенные методы не рассматриваются как объявленные в классе. Они являются новыми реализациями метода, объявленного в базовом классе. Только в том случае, если компилятор C# не смог сопоставить вызов метода с исходным методом в классе Derived, он попытается сопоставить вызов с переназначенным методом с тем же именем и совместимыми параметрами. Пример.

int val = 5;

Derived d = new Derived();

d.DoWork(val); // Calls DoWork(double).

Поскольку переменную val можно неявно преобразовать в тип "double", компилятор C# вызовет DoWork(double) вместо DoWork(int). Чтобы избежать этого, существует два способа. Во-первых, избегайте объявления новых методов с одинаковыми именами в качестве виртуальных. Во-вторых, можно сделать так, чтобы компилятор C# вызвал виртуальный метод, заставив его выполнить поиск в списке методов базового класса за счет приведения экземпляра Derived к Base. Поскольку метод является виртуальным, будет вызвана реализация DoWork(int) в классе Derived. Пример.

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

Knowing When to Use Override and New Keywords

C# enables methods in derived classes to have the same name as methods in base classes—as long as you are very specific about how the new method should be treated. The following example demonstrates the use of the new and override keywords.

First we declare three classes: a base class called Car, and two classes that derive from it, ConvertibleCar and Minivan. The base class contains a single method, DescribeCar, which sends a description of the car to the console. The derived class methods also include a method called DescribeCar, which displays their unique properties. These methods also call the base class DescribeCar method to demonstrate how they have inherited the properties of the Car class.

In order to highlight the difference, the ConvertibleCar class is defined with the new keyword, while the Minivan class is defined with 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.");

}

}