Преобразование к базовому классу объекта

Ссылка на объект может быть неявно преобразована к ссылке на базовый класс этого объекта. Обратите внимание: сам объект при этом не преобразуется к типу базового класса; только ссылка на него превращается в ссылку на тип базового класса. Эту ситуацию иллюстрирует следующий пример:

using System;

public class Base

{

public virtual void WhoAmI()

{

Console.WriteLine("Base");

}

}

public class Derived: Base

{

public override void WhoAmI()

{

Console.WriteLine("Derived");

}

}

public class Test

{

public static void Main()

{

Derived d = new Derived();

Base b = d;

b.WhoAmI();

Derived d2 = (Derived) b;

object o = d;

Derived d3 = (Derived) o;

}

}

Программа выдает следующий результат:

Derived

Сначала создается новый экземпляр класса Derived, и ссылка на этот объект сохраняется в переменной d. Затем ссылка d преобразуется в ссылку на базовый тип Base. Тем не менее, обе ссылки по-прежнему относятся к объекту типа Derived. В этом нетрудно убедиться, поскольку при вызове виртуальной функции WhoAmI() вызывается версия класса Derived. Ссылку b на тип Base можно преобразовать в ссылку на тип Derived, или же преобразовать ссылку на Derived в ссылку на object и обратно.

Преобразование к базовому типу относится к категории неявных преобразований, поскольку, как говорилось в главе 1, производный класс всегда уточняет базовый класс. Другими словами, Derived является частным случаем Base.

Преобразование базового класса в производный возможно не всегда. Поскольку класс Derived является производным от Base, любая ссылка на Base может оказаться ссылкой на объект Derived, приведенной к типу Base. В такой ситуации можно попробовать произвести обратное преобразование. Во время выполнения программа определяет фактический тип объекта, к которому относится ссылка на Base (b в предыдущем примере), и проверяет, действительно ли это тип Derived. Если это не так, инициируется исключение.

Поскольку object является всеобщим базовым типом, любую ссылку на класс можно преобразовать в ссылку на object, а ссылку на object можно попытаться преобразовать в ссылку на любой класс.

Предлагаю ознакомиться с аналогичными статьями: