Синтез интерфейсов (MIDL 3.0)

Назначение членов интерфейсам

класс среда выполнения Windows работает с точки зрения интерфейсов. В большинстве предыдущих примеров интерфейсы были очень едва упомянуты, так как они обычно представляют собой сведения о реализации, которые не нужно контролировать в большинстве случаев.

В результате, когда описание класса не ссылается на интерфейс, но когда оно требуется для реализации класса, компилятор MIDL 3,0 создает и добавляет их при необходимости.

Конструктор по умолчанию

при объявлении конструктора по умолчанию как члена класса компилятор создает среда выполнения Windows класс, активируемого по умолчанию. На уровне реализации это означает, что метаданные описывают класс как активируемого по умолчанию, а фабрика классов для RuntimeClass реализует интерфейс иактиватионфактори .

runtimeclass Area
{
    Area();
    ...
}

В этом случае область компилируется с метаданными [Activatable]типаnull .

Конструкторы, отличные от по умолчанию

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

По умолчанию этот интерфейс называется I <className> Factory, а фабрика класса для RuntimeClass реализует этот интерфейс. Если это имя интерфейса уже используется, компилятор добавляет суффикс целочисленного числа (начиная с 2), пока не обнаружит неиспользуемое имя.

runtimeclass Area
{
    Area(Int32 width, Int32 height);
    ...
}

В этом случае компилятор

  • синтезированный интерфейс фабрики с именем иареафактори,
  • exclusivetoдобавляет атрибут к синтезированному интерфейсу, указывая, что на интерфейс может ссылаться только класс среды выполнения и
  • activatableдобавляет атрибут к классу среды выполнения, указывая, что клиенты могут использовать члены интерфейса иареафактори для создания экземпляров класса.

Таким образом, приведенный выше MIDL может интерпретироваться следующим образом.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Класс может содержать как конструктор по умолчанию, так и дополнительные конструкторы, отличные от по умолчанию.

runtimeclass Area
{
    Area();
    Area(Int32 width, Int32 height);
    ...
}

В этом случае MIDL может интерпретироваться следующим образом. с обеими формами activatable атрибута.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable()]
[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Члены экземпляра

В приведенном ниже примере область имеет элементы Height и Width.

runtimeclass Area : Windows.Foundation.IStringable
{
    Int32 Height;
    Int32 Width;
}

Эти члены не являются частью интерфейса, реализованного в области . Таким образом, компилятор синтезирован для них интерфейс, который по умолчанию имеет < имяclassName> . Если это имя интерфейса уже используется, компилятор добавляет суффикс целочисленного числа (начиная с 2), пока не обнаружит неиспользуемое имя.

В случае с MIDL выше компилятор

  • синтезирован интерфейс иареа ,
  • exclusivetoдобавляет атрибут к синтезированному интерфейсу, указывая, что на интерфейс может ссылаться только класс среды выполнения,
  • Указывает, что класс среды выполнения реализует иареаи
  • делает новый интерфейс интерфейсом по умолчанию для класса среды выполнения, если у класса еще нет интерфейса по умолчанию.

Таким образом, приведенный выше MIDL может интерпретироваться следующим образом.

[exclusiveto(Area)]
interface IArea
{
    Int32 Height;
    Int32 Width;
}

runtimeclass Area : IArea, Windows.Foundation.IStringable
{
}

Статические члены

В приведенном ниже примере область содержит статический член нумберофареас.

runtimeclass Area : Windows.Foundation.IStringable
{
    static Int32 NumberOfAreas { get; };
}

Статический член не является частью какого-либо статического интерфейса, реализуемого областью . Таким образом, компилятор синтезирован для него интерфейс, который по умолчанию имеет < имяclassName> static. Если это имя интерфейса уже используется, компилятор добавляет суффикс целочисленного числа (начиная с 2), пока не обнаружит неиспользуемое имя.

В случае с MIDL выше компилятор

  • синтезирован интерфейс иареастатикс ,
  • exclusivetoдобавляет атрибут к синтезированному интерфейсу, указывая, что на интерфейс может ссылаться только класс среды выполнения и
  • staticsдобавляет атрибут к классу среды выполнения, указывая, что фабрика класса реализует иареастатикс.

Таким образом, приведенный выше MIDL может интерпретироваться следующим образом.

[exclusiveto(Area)]
interface IAreaStatics
{
    Int32 NumberOfAreas { get; };
}

[static(IAreaStatics)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Защищенные элементы

В приведенном ниже примере область содержит защищенный член допротектедворк.

runtimeclass Area : Windows.Foundation.IStringable
{
    protected void DoProtectedWork();
}

Защищенный член не является частью какого-либо защищенного интерфейса, реализованного в области . Таким образом, компилятор синтезирован для него интерфейс с именем, по умолчанию < защищенный вclassName> . Если это имя интерфейса уже используется, компилятор добавляет суффикс целочисленного числа (начиная с 2), пока не обнаружит неиспользуемое имя.

В случае с MIDL выше компилятор

  • синтезирован интерфейс иареапротектед ,
  • exclusivetoдобавляет атрибут к синтезированному интерфейсу, указывая, что на интерфейс может ссылаться только класс среды выполнения и
  • protectedдобавляет атрибут к классу среды выполнения, указывая, что класс реализует защищенный интерфейс иареапротектед.

Таким образом, приведенный выше MIDL может интерпретироваться следующим образом.

[exclusiveto(Area)]
interface IAreaProtected
{
    void DoProtectedWork();
}

[protected(IAreaProtected)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Переопределяемые члены

В приведенном ниже примере том (который является производным от области) имеет переопределяемый член дуверридаблеворк.

runtimeclass Volume : Area
{
    overridable void DoOverridableWork();
}

Переопределяемый член не является частью переопределяемого интерфейса, который реализуется областью . Таким образом, компилятор синтезирован для него интерфейс с именем, по умолчанию < переопределяющийclassName> . Если это имя интерфейса уже используется, компилятор добавляет суффикс целочисленного числа (начиная с 2), пока не обнаружит неиспользуемое имя.

В случае с MIDL выше компилятор

  • синтезирован интерфейс иареаоверридес ,
  • exclusivetoдобавляет атрибут к синтезированному интерфейсу, указывая, что на интерфейс может ссылаться только класс среды выполнения и
  • overridableдобавляет атрибут к классу среды выполнения, указывая, что класс реализует переопределяемый интерфейс иареаоверридес.

Таким образом, приведенный выше MIDL может интерпретироваться следующим образом.

[exclusiveto(Area)]
interface IAreaOverrides
{
    void DoOverridableWork();
}

[overridable(IAreaOverrides)]
runtimeclass Area : Windows.Foundation.IStringable
{
}