Неявное преобразование ссылки на объект в ссылку на интерфейс (см. предыдущий раздел) — случай нестандартный. Как правило, при работе с иерархиями объектов нельзя заранее сказать, реализует ли объект тот или иной интерфейс. В механизме выдачи отладочной информации следующего примера используется интерфейс, если он поддерживается объектом:
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 в противном случае.
Преобразование из одного типа интерфейса к другому
Ссылка на интерфейс неявно преобразуется в ссылку на интерфейс, являющийся базовым для данного интерфейса. Она может быть явно преобразована в ссылку на любой другой интерфейс, даже не являющийся базовым. Такое преобразование проходит успешно лишь в том случае, если ссылка на интерфейс в действительности является ссылкой на объект, реализующий другой интерфейс (к которому осуществляется преобразование).
Преобразования структурных типов
Для структур определено лишь одно встроенное преобразование — неявное преобразование структуры в реализуемый ею интерфейс. Экземпляр структуры упаковывается в ссылочный тип, после чего преобразуется в ссылку на соответствующий интерфейс. Явное преобразование интерфейса в структуру недопустимо.
0 коммент.:
Отправить комментарий