인터페이스(MIDL 3.0) 합성

인터페이스에 멤버 할당

Windows 런타임 클래스는 인터페이스 측면에서 작동합니다. 하지만 인터페이스는 대부분의 경우 제어할 필요가 없는 구현 세부 정보이므로 앞의 대부분의 예제에서 거의 언급되지 않았습니다.

따라서 클래스 설명이 인터페이스를 참조하지 않지만 클래스를 구현하는 데 필요한 경우 MIDL 3.0 컴파일러가 필요에 따라 이를 합성하고 추가합니다.

기본 생성자

기본 생성자를 클래스의 멤버로 선언하면 컴파일러는 기본 활성화 가능한 Windows 런타임 클래스를 생성합니다. 구현 수준에서 메타데이터는 클래스를 기본 활성화 가능으로 설명하고 런타임 클래스의 클래스 팩터리는 IActivationFactory 인터페이스를 구현한다는 것을 의미합니다.

runtimeclass Area
{
    Area();
    ...
}

이 경우 영역형식null이 있는 메타데이터 [Activatable] 로 컴파일됩니다.

기본이 아닌 생성자

하나 이상의 기본이 아닌 생성자를 클래스의 멤버로 선언하면 컴파일러는 기본 활성화가 아닌 활성화 가능한 Windows 런타임 클래스를 생성합니다. 구현 수준에서 메타데이터는 클래스를 활성화 가능으로 설명하고 생성자 메서드를 포함하는 인터페이스를 지정합니다.

기본적으로 이 인터페이스의 이름은 IclassNameFactory><이며 런타임 클래스의 클래스 팩터리는 해당 인터페이스를 구현합니다. 이 인터페이스 이름이 이미 사용 중인 경우 컴파일러는 사용되지 않는 이름을 찾을 때까지 정수 숫자 접미사(2부터 시작)를 추가합니다.

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

이 경우 컴파일러

  • IAreaFactory라는 팩터리 인터페이스를 합성합니다.
  • exclusiveto 는 런타임 클래스에서만 인터페이스를 참조할 수 있도록 지정하여 합성된 인터페이스에 특성을 추가합니다.
  • 는 클라이언트가 activatableIAreaFactory 인터페이스 멤버를 사용하여 클래스의 인스턴스를 만들 수 있음을 나타내는 특성을 런타임 클래스에 추가합니다.

따라서 위의 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
{
    ...
}

인스턴스 멤버

아래 예제에서 Area 에는 높이너비 멤버가 있습니다.

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

이러한 멤버는 Area 에서 구현하는 인터페이스의 일부가 아닙니다. 따라서 컴파일러는 기본적으로 IclassName><이라는 이름의 인터페이스를 합성합니다. 이 인터페이스 이름이 이미 사용 중인 경우 컴파일러는 사용되지 않는 이름을 찾을 때까지 정수 숫자 접미사(2부터 시작)를 추가합니다.

위의 MIDL의 경우 컴파일러

  • IArea 인터페이스를 합성합니다.
  • exclusiveto 는 런타임 클래스에서만 인터페이스를 참조할 수 있도록 지정하여 합성된 인터페이스에 특성을 추가합니다.
  • 는 런타임 클래스가 IArea를 구현하고
  • 는 클래스에 기본 인터페이스가 없는 경우 새 인터페이스를 런타임 클래스의 기본 인터페이스로 만듭니다.

따라서 위의 MIDL은 다음과 같이 해석될 수 있습니다.

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

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

정적 멤버

아래 예제에서 Area 에는 정적 멤버 NumberOfAreas가 있습니다.

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

정적 멤버는 Area 가 구현하는 정적 인터페이스의 일부가 아닙니다. 따라서 컴파일러는 기본적으로 IclassNameStatics<라는 이름의 인터페이스를 >합성합니다. 이 인터페이스 이름이 이미 사용 중인 경우 컴파일러는 사용되지 않는 이름을 찾을 때까지 정수 숫자 접미사(2부터 시작)를 추가합니다.

위의 MIDL의 경우 컴파일러

  • IAreaStatics 인터페이스를 합성합니다.
  • exclusiveto 는 런타임 클래스에서만 인터페이스를 참조할 수 있도록 지정하여 합성된 인터페이스에 특성을 추가합니다.
  • statics 는 클래스 팩터리에서 IAreaStatics를 구현하도록 지정하여 런타임 클래스에 특성을 추가합니다.

따라서 위의 MIDL은 다음과 같이 해석될 수 있습니다.

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

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

보호된 멤버

아래 예제에서 Area 에는 보호된 멤버 DoProtectedWork가 있습니다.

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

보호된 멤버는 Area 에서 구현하는 보호된 인터페이스의 일부가 아닙니다. 따라서 컴파일러는 기본적으로 IclassNameProtected<라는 이름의 인터페이스> 합성합니다. 이 인터페이스 이름이 이미 사용 중인 경우 컴파일러는 사용되지 않는 이름을 찾을 때까지 정수 숫자 접미사(2부터 시작)를 추가합니다.

위의 MIDL의 경우 컴파일러

  • IAreaProtected 인터페이스를 합성합니다.
  • exclusiveto 는 런타임 클래스에서만 인터페이스를 참조할 수 있도록 지정하여 합성된 인터페이스에 특성을 추가합니다.
  • 는 클래스가 protected 보호된 인터페이스 IAreaProtected를 구현하도록 지정하여 런타임 클래스에 특성을 추가합니다.

따라서 위의 MIDL은 다음과 같이 해석될 수 있습니다.

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

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

재정의 가능한 멤버

아래 예제에서 볼륨 ( 영역에서 파생됨)에는 재정의 가능한 멤버 DoOverridableWork가 있습니다.

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

재정의 가능한 멤버는 Area 에서 구현하는 재정의 가능한 인터페이스의 일부가 아닙니다. 따라서 컴파일러는 기본적으로 IclassNameOverrides<라는 이름의 인터페이스> 합성합니다. 이 인터페이스 이름이 이미 사용 중인 경우 컴파일러는 사용되지 않는 이름을 찾을 때까지 정수 숫자 접미사(2부터 시작)를 추가합니다.

위의 MIDL의 경우 컴파일러

  • IAreaOverrides 인터페이스를 합성합니다.
  • exclusiveto 는 런타임 클래스에서만 인터페이스를 참조할 수 있도록 지정하여 합성된 인터페이스에 특성을 추가합니다.
  • 는 클래스가 overridable 재정의 가능한 인터페이스 IAreaOverrides를 구현하도록 지정하여 런타임 클래스에 특성을 추가합니다.

따라서 위의 MIDL은 다음과 같이 해석될 수 있습니다.

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

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