Преобразование к интерфейсу, который может быть реализован объектом

Неявное преобразование ссылки на объект в ссылку на интерфейс (см. предыдущий раздел) — случай нестандартный. Как правило, при работе с иерархиями объектов нельзя заранее сказать, реализует ли объект тот или иной интерфейс. В механизме выдачи отладочной информации следующего примера используется интерфейс, если он поддерживается объектом:

using System;

interface IDebugDump

{

string DumpObject();

}

class Simple

{

public Simple(int value)

{

this.value = value;

}

public override string ToString()

{

return(value.ToString());

}

int value;

}

class Complicated: IDebugDump

{

public Complicated(string name)

{

this.name = name;

}

public override string ToString()

{

return(name);

}

string IDebugDump.DumpObject()

{

return(String.Format(

"{0}\nLatency: {0}\nRequests: {1}\nFailures: {0}\n",

new object[] {name, latency, requestCount, failedCount} ));

}

string name;

int latency = 0;

int requestCount = 0;

int failedCount = 0;

}

class Test

{

public static void DoConsoleDump(params object[] arr)

{

foreach (object o in arr)

{

IDebugDump dumper = o as IDebugDump;

if (dumper != null)

Console.WriteLine("{0}", dumper.DumpObject());

else

Console.WriteLine("{0}", o);

}

}

public static void Main()

{

Simple s = new Simple(13);

Complicated c = new Complicated("Tracking Test");

DoConsoleDump(s, c);

}

}

В этом примере имеется несколько отладочных функций, предназначенных для выдачи информации о внутреннем состоянии объектов. Одни объекты обладают сложным внутренним состоянием и возвращают расширенную информацию, тогда так для других вполне достаточно информации, возвращаемой функцией ToString().

Данная концепция хорошо выражается интерфейсом IDebugDump, генерирующим отладочные данные (если в классе присутствует реализация этого интерфейса).

Использованный в примере оператор as возвращает ссылку на интерфейс, если он реализуется объектом, и null в противном случае.

Преобразование из одного типа интерфейса к другому

Ссылка на интерфейс неявно преобразуется в ссылку на интерфейс, являющийся базовым для данного интерфейса. Она может быть явно преобразована в ссылку на любой другой интерфейс, даже не являющийся базовым. Такое преобразование проходит успешно лишь в том случае, если ссылка на интерфейс в действительности является ссылкой на объект, реализующий другой интерфейс (к которому осуществляется преобразование).

Преобразования структурных типов

Для структур определено лишь одно встроенное преобразование — неявное преобразование структуры в реализуемый ею интерфейс. Экземпляр структуры упаковывается в ссылочный тип, после чего преобразуется в ссылку на соответствующий интерфейс. Явное преобразование интерфейса в структуру недопустимо.

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