W Celu C masz pojęcie wysyłania wiadomości do innych obiektów i jest to bardzo podobne do wywoływania metod w językach takich jak C # i Java.
Ale jakie dokładnie są subtelne różnice? Co powinienem myśleć o przesyłaniu wiadomości, myśląc o moim kodzie?
Uwaga: trochę tła tutaj, jestem programistą C # / Java, próbującym zrozumieć niektóre pojęcia dotyczące Celu C.
Odpowiedzi:
Komunikat to nazwa selektora i parametry tego selektora.
Selektor to symbol.
Metoda jest fragmentem kodu w klasie identyfikowanej przez selektor.
Innymi słowy,
[foo bar: baz]
mówi „wyślij wiadomość wywoływaną@selector(bar:)
z parametrembaz
do obiektufoo
. Możesz wysłać tę wiadomość do wielu różnych obiektów.W przeciwieństwie do tego może wyglądać metoda
bar:
Foo
ale dla pewnej
FooTwo
może wyglądać(Mam nadzieję, że mam poprawną składnię; minęło trochę czasu, odkąd ostatnio dotknąłem Celu C).
Kiedy wysyłasz wiadomość, jądro Objective-C wysyła wiadomość, do
foo
której decyduje, czy ją rozumie. Decyduje to na podstawie tego, czy może znaleźć metodę zidentyfikowaną przez ten selektor.Dwie metody o tej samej nazwie i jedna wiadomość.
Obiekt może również po prostu przesłać określoną wiadomość (lub zestaw wiadomości) do innego obiektu w celu przetworzenia. W takim przypadku wiadomość jest wysyłana do tego obiektu proxy, który nie ma metod dopasowania tej wiadomości , a serwer proxy przesyła wiadomość do zawiniętego obiektu.
źródło
Z czysto teoretycznego punktu widzenia nie ma między nimi żadnej różnicy - istnieje wiele formalnych dowodów na to, że oba są całkowicie równoważne i oba mogą być zrealizowane całkowicie pod względem drugiego.
Z nieco mniej teoretycznego punktu widzenia istnieje jedna możliwa różnica: w typowej implementacji wirtualna tablica funkcji jest przydzielana statycznie, a zawartość każdego vtable jest ustalana w czasie kompilacji. Natomiast wyszukiwanie wiadomości odbywa się zwykle za pomocą jakiegoś obiektu podobnego do mapy, który jest zazwyczaj dynamiczny, co oznacza, że można go modyfikować w czasie wykonywania. Dzięki temu stosunkowo łatwo można dodać nową odpowiedź do wiadomości w istniejącej klasie. Niestety w większości przypadków pozostaje to w większości teoretyczne. Po pierwsze, masz do czynienia z kodem samodmodyfikującym, który zdaniem większości osób był długim pomysłemczas temu. Po drugie, aby było to bardzo sensowne, musisz właściwie skompilować nowy kod do istniejącej klasy, aby odpowiedzieć na nową wiadomość, którą wspierasz. Bez tego wszystko, co zyskasz, to możliwość dynamicznego dodawania nowej nazwy dla istniejącej metody.
Jak sugeruje koniec poprzedniego akapitu, z naprawdę praktycznego punktu widzenia różnica między nimi jest bardzo niewielka. Są to po prostu dwa (bardzo nieznacznie) różne sposoby wspierania późnego wiązania. Chociaż wyszukiwanie oparte na wiadomościach jest na ogół nieco wolniejsze, byłoby dość niezwykłe, aby różnica była naprawdę znacząca. Dla większości praktycznych celów są to tylko dwa różne sposoby osiągnięcia tego samego.
źródło
W Celu C wiadomości są opóźnione. Oznacza to, że są one rozwiązywane w czasie wykonywania. C # obsługuje podobną konstrukcję za pomocą słowa kluczowego Dynamic, które deklaruje również, że obiekt jest spóźniony.
źródło
Zwykle wywołania metod są rozwiązywane w czasie kompilacji (chyba że używasz odbicia w Javie), podczas gdy komunikaty w celu C są wysyłane w czasie wykonywania.
źródło
struct
jako pierwszy parametr. Późne wiązanie jest istotną częścią polimorfizmu, a zatem OOP.Wiadomości są obsługiwane przez jądro lub sam język (na przykład w ObjC istnieje bardzo mały kod asemblera, który to robi).
Na przykład w jądrze Linux-a komunikaty są wykonywane przy użyciu wywołań / funkcji systemowych: można o nich dowiedzieć się, szukając programowania w systemie uniksowym.
Podstawowa różnica między wywołaniem metody a komunikatem jest następująca:
wywołanie metody występuje tylko w kodzie: w ASM jest tłumaczone przez PUSH przekazanych argumentów.
wiadomość jądra jest przeważnie wysyłana do jądra, które jest śledzone i wysyłane z powrotem do określonych procesów. Mogę pomylić je z potokami, ale cokolwiek: wiedz, że istnieją już mechanizmy, które pozwalają na uruchomienie kilku programów jednocześnie i pozwalają na komunikację w tym samym czasie. Oczywiście nie mam nadziei, że będzie to działać w ten sam sposób w systemie Windows lub innym systemie operacyjnym.
źródło