Неявна типізація, латентна типізація або качина типізація (калька з англ. Duck typing) — різновид динамічної типізації, застосовуваної в деяких мовах програмування, коли межі використання об'єкта визначаються його поточним набором методів і властивостей, на противагу успадкуванню від певного класу. Тобто вважається, що об'єкт реалізує інтерфейс, якщо він містить всі методи цього інтерфейсу, незалежно від зв'язків в ієрархії наслідування та приналежності до якогось конкретного класу.
Назва терміна походить від англійського «duck test» («качиний тест»), який в оригіналі звучить так:
- «If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck».
- («Якщо воно виглядає як качка, плаває як качка і кахкає як качка, то це напевно і є качка»).
Качина типізація розв'язує такі проблеми ієрархічної типізації як:
- неможливість явно вказати (шляхом наслідування) на сумісність інтерфейсу з усіма справжніми та майбутніми інтерфейсами, з якими він ідейно сумісний;
- експоненціальне збільшення числа зв'язків в ієрархії типів при хоча б частковій спробі це зробити.
Іншим близьким підходом є структурні підтипи в OCaml, де типи об'єктів сумісні, якщо сумісні сигнатури їхніх методів, незалежно від оголошеного наслідування, причому все це перевіряється під час компіляції програми.
Приклади концепції
Розглянемо такий псевдокод мови з качиною типізацією:
function calculate(a, b, c) => return (a+b)*c example1 = calculate (1, 2, 3) example2 = calculate ([1, 2, 3], [4, 5, 6], 2) example3 = calculate ('apples ', 'and oranges, ', 3) print to_string example1 print to_string example2 print to_string example3
У цьому прикладі кожного разу викликається функція calculate
з об'єктами без спорідненої спадковості — числа, списки, рядки. Оскільки об'єкти підтримують методи «+» та «*», функція буде виконана. Якщо код, приміром, виконуватиметься у Ruby або Python, результатом буде
9 [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6] apples and oranges, apples and oranges, apples and oranges,
Таким чином, качина типізація дозволяє поліморфізм без успадкування. Єдиним обмеженням на функцію calculate
є здатність її аргументів застосовувати методи «+» та «*».
На Python
Перевірка на качку може бути ілюстрована такими кодами. В цьому прикладі Sparrow
є качкою.
Приклад без успадкування |
---|
class Duck: def fly(self): print("Качка літає") class Sparrow: def fly(self): print("Горобець літає") class Whale: def swim(self): print("Кит плаває") a, b ,c = Duck(), Sparrow(), Whale() for animal in a, b, c: animal.fly() Результат: Качка літає Горобець літає AttributeError: 'Whale' object has no attribute 'fly' |
В цьому прикладі розглядається функція in_the_forest
(у_лісі), згідно з яким об'єкти Human
і Dog
є качками:
Приклад з успадкуванням |
---|
class Animal(object): def __init__(self, name): self.name = name def speak(self): pass class Duck(Animal): def speak(self): return self.quack() def quack(self): return "Кря!" def feathers(self): return "має біле та сіре пір'я." class Dog(Animal): def speak(self): return self.woof() def woof(self): return "Гав!" def feathers(self): return "може знайти пір'я у лісі." class Human(Animal): def speak(self): return "Привіт!" def feathers(self): return "не має пір'я." def in_the_forest(duck): print(duck.name + " каже " + duck.speak() + " і " + duck.feathers()) def game(): animal_a = Duck("Дональд") animal_b = Dog("Сірко") animal_c = Human("Іван") for animal in animal_a, animal_b, animal_c: in_the_forest(animal) game() Результат: Дональд каже Ках! і має біле та сіре пір'я. Іван каже Привіт! і не має пір'я. Сірко каже Гав! і може знайти пір'я у лісі. |
У мовах зі статичною типізацією
Іноді мови зі статичною типізацією, такі як Boo чи версія 4 випуску C# мають додаткову анотацію типів, котра інструктує компілятор розміщувати перевірку типів і класів на стадії виконання, а не під час компіляції, і включати код для перевірки типів у відкомпільований вивід.
Інші мови зі статичною типізацією, наприклад F#, підтримують статичну качину типізацію, коли типи перевіряються на наявність певних сигнатур методів під час компіляції.
Виноски
- . Архів оригіналу за 6 жовтня 2008. Процитовано 9 січня 2014.
- . Архів оригіналу за 16 Грудня 2009. Процитовано 9 Січня 2014.
Посилання
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Neyavna tipizaciya latentna tipizaciya abo kachina tipizaciya kalka z angl Duck typing riznovid dinamichnoyi tipizaciyi zastosovuvanoyi v deyakih movah programuvannya koli mezhi vikoristannya ob yekta viznachayutsya jogo potochnim naborom metodiv i vlastivostej na protivagu uspadkuvannyu vid pevnogo klasu Tobto vvazhayetsya sho ob yekt realizuye interfejs yaksho vin mistit vsi metodi cogo interfejsu nezalezhno vid zv yazkiv v iyerarhiyi nasliduvannya ta prinalezhnosti do yakogos konkretnogo klasu Nazva termina pohodit vid anglijskogo duck test kachinij test yakij v originali zvuchit tak If it looks like a duck swims like a duck and quacks like a duck then it probably is a duck Yaksho vono viglyadaye yak kachka plavaye yak kachka i kahkaye yak kachka to ce napevno i ye kachka Kachina tipizaciya rozv yazuye taki problemi iyerarhichnoyi tipizaciyi yak nemozhlivist yavno vkazati shlyahom nasliduvannya na sumisnist interfejsu z usima spravzhnimi ta majbutnimi interfejsami z yakimi vin idejno sumisnij eksponencialne zbilshennya chisla zv yazkiv v iyerarhiyi tipiv pri hocha b chastkovij sprobi ce zrobiti Inshim blizkim pidhodom ye strukturni pidtipi v OCaml de tipi ob yektiv sumisni yaksho sumisni signaturi yihnih metodiv nezalezhno vid ogoloshenogo nasliduvannya prichomu vse ce pereviryayetsya pid chas kompilyaciyi programi Prikladi koncepciyiRozglyanemo takij psevdokod movi z kachinoyu tipizaciyeyu function calculate a b c gt return a b c example1 calculate 1 2 3 example2 calculate 1 2 3 4 5 6 2 example3 calculate apples and oranges 3 print to string example1 print to string example2 print to string example3 U comu prikladi kozhnogo razu viklikayetsya funkciya calculate z ob yektami bez sporidnenoyi spadkovosti chisla spiski ryadki Oskilki ob yekti pidtrimuyut metodi ta funkciya bude vikonana Yaksho kod primirom vikonuvatimetsya u Ruby abo Python rezultatom bude 9 1 2 3 4 5 6 1 2 3 4 5 6 apples and oranges apples and oranges apples and oranges Takim chinom kachina tipizaciya dozvolyaye polimorfizm bez uspadkuvannya Yedinim obmezhennyam na funkciyu calculate ye zdatnist yiyi argumentiv zastosovuvati metodi ta Na Python Perevirka na kachku mozhe buti ilyustrovana takimi kodami V comu prikladi Sparrow ye kachkoyu Priklad bez uspadkuvannya class Duck def fly self print Kachka litaye class Sparrow def fly self print Gorobec litaye class Whale def swim self print Kit plavaye a b c Duck Sparrow Whale for animal in a b c animal fly Rezultat Kachka litaye Gorobec litaye AttributeError Whale object has no attribute fly V comu prikladi rozglyadayetsya funkciya in the forest u lisi zgidno z yakim ob yekti Human i Dog ye kachkami Priklad z uspadkuvannyam class Animal object def init self name self name name def speak self pass class Duck Animal def speak self return self quack def quack self return Krya def feathers self return maye bile ta sire pir ya class Dog Animal def speak self return self woof def woof self return Gav def feathers self return mozhe znajti pir ya u lisi class Human Animal def speak self return Privit def feathers self return ne maye pir ya def in the forest duck print duck name kazhe duck speak i duck feathers def game animal a Duck Donald animal b Dog Sirko animal c Human Ivan for animal in animal a animal b animal c in the forest animal game Rezultat Donald kazhe Kah i maye bile ta sire pir ya Ivan kazhe Privit i ne maye pir ya Sirko kazhe Gav i mozhe znajti pir ya u lisi U movah zi statichnoyu tipizaciyeyuInodi movi zi statichnoyu tipizaciyeyu taki yak Boo chi versiya 4 vipusku C mayut dodatkovu anotaciyu tipiv kotra instruktuye kompilyator rozmishuvati perevirku tipiv i klasiv na stadiyi vikonannya a ne pid chas kompilyaciyi i vklyuchati kod dlya perevirki tipiv u vidkompilovanij vivid Inshi movi zi statichnoyu tipizaciyeyu napriklad F pidtrimuyut statichnu kachinu tipizaciyu koli tipi pereviryayutsya na nayavnist pevnih signatur metodiv pid chas kompilyaciyi Vinoski Arhiv originalu za 6 zhovtnya 2008 Procitovano 9 sichnya 2014 Arhiv originalu za 16 Grudnya 2009 Procitovano 9 Sichnya 2014 Posilannya