Wskaźniki interfejsu i interfejsy
Wystąpienie implementacji interfejsu jest w rzeczywistości wskaźnikiem do tablicy wskaźników do metod — czyli tabeli funkcji odwołującej się do implementacji wszystkich metod określonych w interfejsie. Obiekty z wieloma interfejsami mogą udostępniać wskaźniki więcej niż jednej tabeli funkcji. Każdy kod, który ma wskaźnik, za pomocą którego może uzyskać dostęp do tablicy, może wywołać metody w tym interfejsie.
Mówiąc dokładnie o tym wielu pośrednich jest niewygodne, więc zamiast tego wskaźnik do tabeli funkcji interfejsu, który inny obiekt musi wywołać jego metody, jest nazywany po prostu wskaźnikiem interfejsu . Tabele funkcji można tworzyć ręcznie w aplikacji języka C lub niemal automatycznie przy użyciu języka Visual C++ (lub innych języków zorientowanych na obiekty, które obsługują com).
Dzięki odpowiedniej obsłudze kompilatora (która jest nieodłączna w języku C i C++), klient może wywołać metodę interfejsu za pomocą jego nazwy, a nie jej pozycji w tablicy. Ponieważ interfejs jest typem, kompilator, biorąc pod uwagę nazwy metod, może sprawdzić typy parametrów i zwracane wartości każdego wywołania metody interfejsu. W przeciwieństwie do tego, jeśli klient używa schematu wywoływania opartego na pozycji, takie sprawdzanie typów nie jest dostępne, nawet w języku C lub C++.
Każdy interfejs jest niezmiennym kontraktem grupy funkcjonalnej metod. Odwołujesz się do interfejsu w czasie wykonywania z globalnie unikatowym identyfikatorem interfejsu (IID). Ten identyfikator IID, który jest konkretnym wystąpieniem globalnie unikatowego identyfikatora (GUID) obsługiwanego przez com, pozwala klientowi dokładnie zapytać obiekt, czy obsługuje semantyka interfejsu, bez niepotrzebnych obciążeń i bez pomyłek, które mogą wystąpić w systemie z wielu wersji tego samego interfejsu o tej samej nazwie.
Podsumowując, ważne jest, aby zrozumieć, czym jest interfejs COM i nie jest:
- Interfejs COM nie jest taki sam jak klasa C++. Czysta definicja wirtualna nie ma implementacji. Jeśli jesteś programistą języka C++, możesz zdefiniować implementację interfejsu jako klasę, ale znajduje się to pod nagłówkiem szczegółów implementacji, które com nie określa. Wystąpienie obiektu, które implementuje interfejs, musi zostać utworzone, aby interfejs rzeczywiście istniał. Ponadto różne klasy obiektów mogą implementować interfejs inaczej, ale mogą być używane zamiennie w postaci binarnej, o ile zachowanie jest zgodne z definicją interfejsu.
- Interfejs COM nie jest obiektem. Jest to po prostu powiązana grupa funkcji i jest standardem binarnym, za pomocą którego komunikują się klienci i obiekty. Tak długo, jak może zapewnić wskaźniki do metod interfejsu, obiekt można zaimplementować w dowolnym języku z dowolną reprezentacją stanu wewnętrznego.
- Interfejsy COM są silnie typizowane. Każdy interfejs ma własny identyfikator interfejsu (IDENTYFIKATOR GUID), który eliminuje możliwość duplikowania, które mogą wystąpić w przypadku dowolnego innego schematu nazewnictwa.
- Interfejsy COM są niezmienne. Nie można zdefiniować nowej wersji starego interfejsu i nadać mu ten sam identyfikator. Dodawanie lub usuwanie metod interfejsu lub zmienianie semantyki powoduje utworzenie nowego interfejsu, a nie nowej wersji starego interfejsu. W związku z tym nowy interfejs nie może powodować konfliktu ze starym interfejsem. Jednak obiekty mogą obsługiwać wiele interfejsów jednocześnie i mogą uwidaczniać interfejsy, które są kolejnymi poprawkami interfejsu z różnymi identyfikatorami. W związku z tym każdy interfejs jest oddzielnym kontraktem, a obiekty w całym systemie nie muszą być zaniepokojone tym, czy wersja wywoływanego interfejsu jest oczekiwana. Identyfikator interfejsu (IID) definiuje jawnie i unikatowo kontrakt interfejsu.
Tematy pokrewne