Я работаю с MS Excel interop в C#, и я не понимаю, как эта конкретная строка кода работает:
var excel = new Microsoft.Office.Interop.Excel.Application();
где Microsoft. Office. Interop. Excel. Приложением является ИНТЕРФЕЙС, определенный как:
[Guid("000208D5-0000-0000-C000-000000000046")]
[CoClass(typeof(ApplicationClass))]
public interface Application : _Application, AppEvents_Event
{
}
Я думаю, что некоторое волшебство происходит, когда интерфейс украшен атрибутом CoClass, но все еще как возможно, что мы можем создать экземпляр интерфейса с новым ключевым словом? Разве это не должно генерировать ошибку времени компиляции?
Фактически код, который вы упомянули, создал экземпляр класса ApplicationClass
, и это то, что делает атрибут CoClass
.
Подробнее см. В этом ответе: Как компилятор C # определяет типы COM?
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();