인터페이스 포인터 및 인터페이스

인터페이스 구현의 instance 실제로 메서드에 대한 포인터 배열에 대한 포인터입니다. 즉, 인터페이스에 지정된 모든 메서드의 구현을 참조하는 함수 테이블입니다. 여러 인터페이스가 있는 개체는 둘 이상의 함수 테이블에 대한 포인터를 제공할 수 있습니다. 배열에 액세스할 수 있는 포인터가 있는 모든 코드는 해당 인터페이스에서 메서드를 호출할 수 있습니다.

이 여러 간접 참조에 대해 정확하게 말하는 것은 불편하므로 대신 다른 개체가 메서드를 호출해야 하는 인터페이스 함수 테이블에 대한 포인터를 단순히 인터페이스 포인터라고 합니다. Visual C++(또는 COM을 지원하는 다른 개체 지향 언어)를 사용하여 C 애플리케이션 또는 거의 자동으로 함수 테이블을 수동으로 만들 수 있습니다.

적절한 컴파일러 지원(C 및 C++에 내재되어 있음)을 사용하면 클라이언트는 배열의 위치가 아닌 이름을 통해 인터페이스 메서드를 호출할 수 있습니다. 인터페이스는 형식이므로 메서드 이름이 지정된 컴파일러는 각 인터페이스 메서드 호출의 매개 변수 형식과 반환 값을 검사 수 있습니다. 반면 클라이언트가 위치 기반 호출 체계를 사용하는 경우 C 또는 C++에서도 이러한 형식 검사를 사용할 수 없습니다.

각 인터페이스는 함수 메서드 그룹의 변경할 수 없는 계약입니다. 전역적으로 고유한 IID(인터페이스 식별자)를 사용하여 런타임에 인터페이스를 참조합니다. COM에서 지원하는 GUID(Globally Unique Identifier)의 특정 instance 이 IID를 사용하면 클라이언트가 불필요한 오버헤드 없이 동일한 이름의 동일한 인터페이스의 여러 버전이 시스템에서 발생할 수 있는 혼동 없이 인터페이스의 의미 체계를 지원하는지 여부를 정확하게 개체에 요청할 수 있습니다.

요약하자면 COM 인터페이스가 무엇인지 이해하는 것이 중요하며 그렇지 않습니다.

  • COM 인터페이스는 C++ 클래스와 동일하지 않습니다. 순수 가상 정의는 구현을 수행하지 않습니다. C++ 프로그래머인 경우 인터페이스의 구현을 클래스로 정의할 수 있지만 이는 COM에서 지정하지 않는 구현 세부 정보의 제목에 해당합니다. 인터페이스를 구현하는 개체의 instance 인터페이스가 실제로 존재하도록 만들어야 합니다. 또한 동작이 인터페이스 정의를 준수하는 한 다른 개체 클래스는 인터페이스를 다르게 구현할 수 있지만 이진 형식에서 서로 바꿔 사용할 수 있습니다.
  • COM 인터페이스는 개체가 아닙니다. 이는 단순히 관련 함수 그룹이며 클라이언트와 개체가 통신하는 이진 표준입니다. 인터페이스 메서드에 대한 포인터를 제공할 수 있는 한 개체는 내부 상태 표현을 사용하여 모든 언어로 구현할 수 있습니다.
  • COM 인터페이스는 강력한 형식입니다. 모든 인터페이스에는 고유한 인터페이스 식별자(GUID)가 있어 다른 명명 체계에서 발생할 수 있는 중복 가능성을 제거합니다.
  • COM 인터페이스는 변경할 수 없습니다. 이전 인터페이스의 새 버전을 정의하고 동일한 식별자를 제공할 수 없습니다. 인터페이스의 메서드를 추가하거나 제거하거나 의미 체계를 변경하면 새 버전의 이전 인터페이스가 아닌 새 인터페이스가 만들어집니다. 따라서 새 인터페이스는 이전 인터페이스와 충돌할 수 없습니다. 그러나 개체는 여러 인터페이스를 동시에 지원할 수 있으며 인터페이스의 연속 수정 버전인 인터페이스를 다른 식별자와 함께 노출할 수 있습니다. 따라서 각 인터페이스는 별도의 계약이며 시스템 전체 개체는 호출하는 인터페이스의 버전이 필요한지 여부에 대해 걱정할 필요가 없습니다. IID(인터페이스 ID)는 인터페이스 계약을 명시적이고 고유하게 정의합니다.

COM 개체 및 인터페이스