Создание экземпляра интерфейса в C # - PullRequest
5 голосов
/ 20 марта 2010

Я работаю с взаимодействием MS Excel в C # и не понимаю, как работает эта конкретная строка кода:

var excel = new Microsoft.Office.Interop.Excel.Application();

, где Microsoft.Office.Interop.Excel.Application представляет собой ИНТЕРФЕЙС, определяемый как:

[Guid("000208D5-0000-0000-C000-000000000046")]
[CoClass(typeof(ApplicationClass))]
public interface Application : _Application, AppEvents_Event
{
}

Я думаю, что какое-то волшебство происходит, когда интерфейс украшен атрибутом CoClass, но все же как это возможно, что мы можем создать экземпляр интерфейса с новым ключевым словом? Разве это не должно генерировать ошибку времени компиляции?

Ответы [ 3 ]

4 голосов
/ 20 марта 2010

Айенде написал в блоге об этом.

3 голосов
/ 20 марта 2010

На самом деле код, который вы упомянули, создал экземпляр класса ApplicationClass, и именно это делает атрибут CoClass.

Подробности см. В этом ответе: Как компилятор C # определяет типы COM?

1 голос
/ 20 марта 2010

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

По второму вопросу: нет, вы не можете создать интерфейс с ключевым словом «new». Потому что любой интерфейс имеет только объявление методов, а не реализацию. Вы можете попробовать это для создания собственных классов и интерфейсов:

interface MyIntf {
   void method1(string s1);
}

public class MyIntfImplementation : MyIntf {

   void method1(string s1) {
     // do it something
   }
}

После этого вы можете использовать это:

MyIntf q = new MyIntfImplementation();
q.method1();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...