Ця стаття не містить . (липень 2011) |
Фу́нкціональний об'єкт (англ. function object), функтор, об'єкт-функція — концепція в програмуванні, яка передбачає використання об'єкта класу як функції (часто зі збереженням синтаксису виклику).
Використання
Функтори легко використовувати для написання колбеків.
C та
В С++ функтор можливо визначити явно чи використати із замиканням як анонімний функтор.
Розглянемо приклад функції сортування, яка для порівняння двох елементів використовує колбек-функцію. Програма може мати такий вигляд:
# include <stdlib.h> /* колбек-функція порівняння елементів */ int compare_ints_function(void *A, void *B) { return *((int *)(A)) < *((int *)(B)); } … /* С декларація функції сортування */ void sort(void *first_item, size_t item_size, void *last_item, int (*cmpfunc)(void *, void *)); … int main(void) { int items[] = {4, 3, 1, 2}; sort((void *)(items), sizeof(int), (void *)(items + 3), compare_ints_function); return 0; }
У замість функції можна використати об'єкт класу в якому перевизначений оператор operator()
. Програма може мати такий вигляд:
struct compare_class { bool operator()(int A, int B) const { return A < B; } }; … // С++ декларація функції сортування template <class ComparisonFunctor> void sort_ints(int* begin_items, int num_items, ComparisonFunctor c); … int main() { int items[] = {4, 3, 1, 2}; sort_ints(items, sizeof(items)/sizeof(items[0]), compare_class()); }
Зауваж, що синтаксис передачі колбеку в sort_ints()
ідентичний, але в С++ варіанті передається об'єкт а не вказівник на функцію. Під час виклику колбек-функція виконується як і будь-який інший метод і тому має повний доступ до інших методів та полів класу.
C#
У C# функтори реалізовано у вигляді .
Objective-C
В Objective-C об'єкт-функція створюється шляхом використання класу NSInvocation
. Для створення функтора потрібні: сигнатура методу, цільовий об'єкт та вказівник методу (selector). Приклад коду в якому викликається метод buildDocument
:
// створення функтора SEL sel = @selector(buildDocument); NSInvocation* inv = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector:sel]]; [inv setTarget:self]; [inv setSelector:sel]; // запустити викликати [inv invoke];
Перевага класу NSInvocation
в тому що цільовий об'єкт можна змінити після створення екземпляру NSInvocation
. Один екземпляр NSInvocation
можна перевикористати для виклику на різних об'єктах.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno lipen 2011 Fu nkcionalnij ob yekt angl function object funktor ob yekt funkciya koncepciya v programuvanni yaka peredbachaye vikoristannya ob yekta klasu yak funkciyi chasto zi zberezhennyam sintaksisu vikliku VikoristannyaFunktori legko vikoristovuvati dlya napisannya kolbekiv C ta C V S funktor mozhlivo viznachiti yavno chi vikoristati lyambda viraz iz zamikannyam yak anonimnij funktor Rozglyanemo priklad funkciyi sortuvannya yaka dlya porivnyannya dvoh elementiv vikoristovuye kolbek funkciyu Programa mozhe mati takij viglyad include lt stdlib h gt kolbek funkciya porivnyannya elementiv int compare ints function void A void B return int A lt int B S deklaraciya funkciyi sortuvannya void sort void first item size t item size void last item int cmpfunc void void int main void int items 4 3 1 2 sort void items sizeof int void items 3 compare ints function return 0 U C zamist funkciyi mozhna vikoristati ob yekt klasu v yakomu pereviznachenij operator operator Programa mozhe mati takij viglyad struct compare class bool operator int A int B const return A lt B S deklaraciya funkciyi sortuvannya template lt class ComparisonFunctor gt void sort ints int begin items int num items ComparisonFunctor c int main int items 4 3 1 2 sort ints items sizeof items sizeof items 0 compare class Zauvazh sho sintaksis peredachi kolbeku v sort ints identichnij ale v S varianti peredayetsya ob yekt a ne vkazivnik na funkciyu Pid chas vikliku kolbek funkciya vikonuyetsya yak i bud yakij inshij metod i tomu maye povnij dostup do inshih metodiv ta poliv klasu C U C funktori realizovano u viglyadi Objective CV Objective C ob yekt funkciya stvoryuyetsya shlyahom vikoristannya klasu NSInvocation Dlya stvorennya funktora potribni signatura metodu cilovij ob yekt ta vkazivnik metodu selector Priklad kodu v yakomu viklikayetsya metod buildDocument stvorennya funktora SEL sel selector buildDocument NSInvocation inv NSInvocation invocationWithMethodSignature self methodSignatureForSelector sel inv setTarget self inv setSelector sel zapustiti viklikati inv invoke Perevaga klasu NSInvocation v tomu sho cilovij ob yekt mozhna zminiti pislya stvorennya ekzemplyaru NSInvocation Odin ekzemplyar NSInvocation mozhna perevikoristati dlya vikliku na riznih ob yektah