У машынным праграмаваньні качыная тыпізацыя — гэта прымяненьне тэсту на качку — «Калі нешта ходзіць як качка і квакча як качка, тады, яно павінна быць качкаю» — для вызначэньня магчымасьці выкарыстаньня аб’екта з пэўнай мэтаю. Пры намінатыўнай тыпізацыі аб’ект належыць да дадзенага тыпу, калі ён аб’яўлены як такі (або калі асацыяцыя тыпу з аб’ектам вызначаецца праз такія мэханізмы, як спадкаваньне). Пры качынай тыпізацыі — калі ён мае ўсе неабходныя для гэтага тыпу мэтады і ўласьцівасьці.[1][2] Качыную тыпізацыю можна разглядаць як структурную эквівалентнасць паміж дадзеным аб’ектам і патрэбным тыпам.

Наступны прыклад на Python 3 дэманструе, як любы аб’ект можа выкарыстоўвацца ў любым кантэксьце, пакуль ён здольны на тое, што ад яго патрабуюць.

class Duck:
    def swim(self):
        print("Качка плыве")

    def fly(self):
        print("Качка ляціць")

class Whale:
    def swim(self):
        print("Кіт плыве")

for animal in [Duck(), Whale()]:
    animal.swim()
    animal.fly()

Вынік:

Качка плыве
Качка ляціць
Кіт плыве
AttributeError: 'Whale' object has no attribute 'fly'

Калі можна ўявіць, што ўсё, што можа плаваць, з’яўляецца качкаю — кіт можа лічыцца качкаю; але, калі таксама патрэбна, каб качка мела здольнасьць лётаць, кіт не можа лічыцца качкаю.

У мовах са статычнай тыпізацыяй

рэдагаваць

У некаторых мовах са статычнай тыпізацыяй, такіх як Boo[3] й D,[4][5] праверку тыпаў клясаў можна ажыцьцяўляць падчас выканання, а не кампіляцыі.

Параўнаньне з іншымі сыстэмамі тыпаў

рэдагаваць

Структурная тыпізацыя

рэдагаваць

Качыная тыпізацыя мае падобныя рысы са структурнай тыпізацыяй. Структурная тыпізацыя — гэта статычная тыпізацыі, якая суадносіць тыпы па іх структуры, у той час як качыная тыпізацыя з’яўляецца дынамічнай і суадносіць тыпы толькі па той частцы структуры, да якой звяртаюцца падчас выкананьня.

Мовы TypeScript,[6] Elm[7] і Python[8] у той ці іншай ступені падтрымліваюць структурную тыпізацыю.

Пратаколы й інтэрфэйсы

рэдагаваць

Пратаколы й інтэрфэйсы дазваляюць яўна вызначыць мэтады, апэратары й паводзіны аб’екта. Калі зьнешняя бібліятэка рэалізуе нязменную клясу, кліент не можа карыстацца яе экзэмплярам з інтэрфейсам, невядомым гэтай бібліятэцы, нават калі кляса задавальняе патрабаваньням інтэрфэйса. Вядомым вырашэньнем гэтае праблемы з’яўляецца патэрн Адаптэр. У супрацьлегласць гэтаму, пры качынай тыпізацыі аб’ект будзе прыняты непасрэдна без неабходнасьці адаптэра.

Шаблённыя тыпы

рэдагаваць

Шаблённыя функцыі або мэтады прымяняюць качыны тэст у кантэксьце статычнае тыпізацыі, што сумяшчае ўсе перавагі і недахопы як статычнае так і дынамічнае праверкі тыпаў. Як больш гнуткая качыная тыпізацыя дазваляе рэалізаваць толькі мэтады фактычна выклікаемыя падчас выканання, у той час як шаблёны патрабуюць рэалізацыі ўсіх мэтадаў, нават калі яны застануцца нявыкарыстанымі.

У такіх мовах, як Java, Scala і Objective-C, рэфлексія можа быць выкарыстана для праверкі структуры аб’екта. Напрыклад, Java MethodHandle API можна ўжытае такім чынам.[9]