Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


ДИНАМИЧЕСКАЯ ИДЕНТИФИКАЦИЯ ТИПОВ. ОТРАЖЕНИЕ


Download 2.46 Mb.
bet76/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   72   73   74   75   76   77   78   79   ...   91
Bog'liq
Язык программирования C#

17. ДИНАМИЧЕСКАЯ ИДЕНТИФИКАЦИЯ ТИПОВ. ОТРАЖЕНИЕ


17.1. Понятие динамической идентификации типов

Название технологии говорит само за себя. Динамическая идентификация типов позволяет определять тип объекта во время выполнения, в противоположность статической идентификации на этапе компиляции. Динамическая идентификация типов – это процесс обнаружения типов во время работы программы. Без динамической идентификации типов невозможно серьезное применение ООП и немыслимо само понятие отражений.


Весь механизм динамической идентификации типов основан на использовании ключевых трех слов is, as, typeof.


17.2. Приведение объектов

В среде .Net объект A совместим с объектом B только в том случае, если объект B имеет тот же тип, что и A или объект A имеет тип базовый для объекта. Другими словами объект совместим только с собственным типом и типом производным от него.


Оператор is позволяет определить, совместим ли рассматриваемый объект с заданным статическим типом без проведения самого приведения типов. Например, чтобы проверить, совместим ли объект с типом string, достаточно построить следующую конструкцию.
if (obj is string)
{
}
Лист. 8.1

Если объект имеет совместимый тип, то is вернет true, в противном случае is вернет false. Если объект равен null, то is также вернет false. Оператор is не проверяет явные и неявные преобразования, определенные пользователем посредством соответствующих операторов.


Оператор as используется для явного преобразования объекта к некоторому типу. Например, чтобы привести объект к типу string надо выполнить следующие инструкции.


string s = someObject as string;


if (s != null)
{
// someObject совместим с типом string
}
Лист. 8.2

Если объект имеет совместимый тип, то оператор as приведет типы, иначе он возвращает null. Поэтому после приведения c помощью as обычно проверяют результат на null. Оператор as не проводит явных или неявных приведений определенных программистом. В отличие от обычного скобочного приведения оператор as не вызывает исключений в случае невозможности привести типы. Поэтому помимо ветки выполняющийся в случае, если получившийся объект не равен null, необходимо создавать и else ветку, иначе можно будет столкнуться с трудноуловимыми ошибками.


Подытожим вышесказанное традиционным примером консольного приложения. Для иллюстрации мы создадим простую иерархию классов, далее создадим несколько объектов этих классов и попробую привести их друг к другу в разных комбинациях.

sing System;


namespace RTTI
{
// базовый класс
class A
{
}

// роизводный класс


class B : A
{
}

class Program


{
static void Main(string[] args)
{
// создаем объекты иерархии
A myA = new A();
B myB = new B();

Console.WriteLine("Объект myA имеет тип A");


Console.WriteLine("Объект myB имеет тип B");

// поверка совместимостей в группе наследования


Console.Write("myA и тип A ");
if (myA is A)
Console.WriteLine("Совместимы");
else
Console.WriteLine("Несовместимы");

Console.Write("myA и тип B ");


if (myA is B)
Console.WriteLine("Совместимы");
else
Console.WriteLine("Несовместимы");

Console.Write("myB и тип A ");


if (myB is A)
Console.WriteLine("Совместимы");
else
Console.WriteLine("Несовместимы");

Console.Write("myB и тип B ");


if (myB is B)
Console.WriteLine("Совместимы");
else
Console.WriteLine("Несовместимы");

// проверка на совместимость с внешнеими классами


Console.Write("myA iи тип System.String ");
if (myB is string)
Console.WriteLine("Совместимы");
else
Console.WriteLine("Несовместимы");

// опервтор as


myA = myB as A;
if (myA != null)
Console.WriteLine("myA совместим с myB");
else
Console.WriteLine("myA несовместим с myB");
}
}
}
Лист. 8.3
Весь листинг представляет собой проверку на совместимость разных типов. В первой части эта проверка производится посредством оператора is и, соответственно, не содержит конкретных приведений. Во второй же части проверка производится посредством оператора as, для которого проверка типов лишь побочный эффект, достигаемый последующий проверкой результата на равенство null.
Вывод примера:

Объект myA имеет тип A


Объект myB имеет тип B
myA и тип A Совместимы
myA и тип B Несовместимы
myB и тип A Совместимы
myB и тип B Совместимы
myA iи тип System.String Несовместимы
myA совместим с myB
Вывод. 8.1

Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   72   73   74   75   76   77   78   79   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling