Interfejsy i implementacje interfejsów
Model COM rozróżnia podstawowe definicje interfejsów i ich implementacje.
Interfejs jest w rzeczywistości kontraktem składającym się z grupy powiązanych prototypów funkcji, których użycie jest zdefiniowane, ale których implementacja nie jest. Te prototypy funkcji są równoważne czystym wirtualnym klasom bazowym w programowaniu w języku C++. Definicja interfejsu określa funkcje składowe interfejsu, nazywane metodami , ich zwracanych typów, liczby i typów ich parametrów oraz czynności, które muszą wykonać. Nie ma implementacji skojarzonej z interfejsem.
Implementacja interfejsu to kod, który programista dostarcza do wykonywania akcji określonych w definicji interfejsu. Implementacje wielu interfejsów, których programista może używać w aplikacji opartej na obiektach, są zawarte w bibliotekach COM. Jednak programiści mogą ignorować te implementacje i pisać własne. Implementacja interfejsu ma być skojarzona z obiektem po utworzeniu wystąpienia tego obiektu, a implementacja zapewnia usługi, które oferuje obiekt.
Na przykład hipotetyczny interfejs o nazwie IStack może definiować dwie metody o nazwie Push i Pop, określając, że kolejne wywołania metody Pop zwracają, w odwrotnej kolejności, wartości przekazane wcześniej do metody Push. Ta definicja interfejsu nie określa sposobu implementacji funkcji w kodzie. W implementacji interfejsu jeden programista może zaimplementować stos jako tablicę i zaimplementować metody wypychania i pop w taki sposób, aby uzyskać dostęp do tej tablicy, podczas gdy inny programista może używać listy połączonej i odpowiednio zaimplementować metody. Niezależnie od konkretnej implementacji metod wypychania i pop reprezentacja wskaźnika w pamięci do interfejsu IStack, a zatem jego użycie przez klienta, jest całkowicie określane przez definicję interfejsu.
Proste obiekty obsługują tylko jeden interfejs. Bardziej skomplikowane obiekty, takie jak obiekty osadzania, zwykle obsługują kilka interfejsów. Klienci mają dostęp do obiektu COM tylko za pośrednictwem wskaźnika do jednego z jego interfejsów, co z kolei umożliwia klientowi wywołanie dowolnej metody tworzącej ten interfejs. Te metody określają, w jaki sposób klient może używać danych obiektu.
Interfejsy definiują kontrakt między obiektem a jego klientami. Kontrakt określa metody, które muszą być skojarzone z każdym interfejsem i jakie zachowanie poszczególnych metod musi być pod względem danych wejściowych i wyjściowych. Umowa zazwyczaj nie definiuje sposobu implementowania metod w interfejsie. Innym ważnym aspektem kontraktu jest to, że jeśli obiekt obsługuje interfejs, musi obsługiwać wszystkie metody tego interfejsu w jakiś sposób. Nie wszystkie metody w implementacji muszą coś zrobić. Jeśli obiekt nie obsługuje funkcji sugerowanej przez metodę, jej implementacja może być prostym zwróceniem lub być może zwróceniem znaczącego komunikatu o błędzie — ale metody muszą istnieć.
Tematy pokrewne