Ссылка на объект может быть неявно преобразована к ссылке на базовый класс этого объекта. Обратите внимание: сам объект при этом не преобразуется к типу базового класса; только ссылка на него превращается в ссылку на тип базового класса. Эту ситуацию иллюстрирует следующий пример:
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 можно попытаться преобразовать в ссылку на любой класс.
0 коммент.:
Отправить комментарий