Можно ли создать экземпляр интерфейса и объявлять в интерфейсе делегаты?
Вопрос по C#: Можно ли создать экземпляр интерфейса и объявлять в интерфейсе делегаты?
Вопрос по C#: Можно ли создать экземпляр интерфейса и объявлять в интерфейсе делегаты?
Понятие "экземпляр интерфейса (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();
Экземпляр самого интерфейса создать нельзя. Но можно создавать экземпляры классов, его реализующих. Добавлять делегаты в интерфейс нельзя, но можно добавлять события