Можно ли создать экземпляр интерфейса и объявлять в интерфейсе делегаты?

Рейтинг: 2Ответов: 2Опубликовано: 21.12.2014

Вопрос по C#: Можно ли создать экземпляр интерфейса и объявлять в интерфейсе делегаты?

Ответы

▲ 4

Понятие "экземпляр интерфейса (instance of an interface)" как таковое не корректно! Интерфейс не может содержать в себе реализацию, не является объектом и служит для того что бы задавать поведение объекту (классу).

Но тем не менее существует способ откомпилировать вот такой вот код:

public interface IFoo
{
    //Some methods
}

static void Main(string[] args)
{
     IFoo iFoo = new IFoo();
}

Это становится возможным когда для интерфейса мы задаем CoClassAttribute. Простыми словами этот атрибут используется для указания типа "совместного" класса и взаимодействия с ним с помощью интерфейса. Использование CoClassAttribute тянет за собой также использование атрибутов ComImportAttribute и GuidAttribute.

Полный код выглядит так:

[Guid("9D1752A0-BA61-43C6-AA6A-25674A5F1032")]
[CoClass(typeof(Foo))]
[ComImport]
public interface IFoo
{

}

public class Foo : IFoo // Хотя для компиляции реализация этого интерфейса не обязательна - получите в runtime InvalidCastException, но обязательна для работы
{

}    

Таким образом, когда мы делаем запись в виде:

IFoo iFoo = new IFoo();

Дальше очевидно, на самом деле создается экземпляр класса Foo, т.е. как бы мы писали:

IFoo iFoo = new Foo();

P.S. Такое использование можно встретить, например, в interop сервисах MS Office: Microsoft.Office.Interop.Word.Application

Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
▲ 3

Экземпляр самого интерфейса создать нельзя. Но можно создавать экземпляры классов, его реализующих. Добавлять делегаты в интерфейс нельзя, но можно добавлять события