(Go: >> BACK << -|- >> HOME <<)

Качыная тыпізацыя: розьніца паміж вэрсіямі

Змесціва выдалена Змесціва дададзена
Створана перакладам старонкі «Duck typing»
 
Няма апісаньня зьменаў
Радок 1:
У [[Кампутарнае праграмаваньне|машынным праграмаваньні]] '''качыная тыпізацыя''' - гэта прымяненьне [[Тэст на качку|тэсту на качку]] &#x2014; "Калі нешта ходзіць як качка і квакча як качка, тады, яно павінна быць качкаю" &#x2014; для вызначэньня магчымасьці выкарыстаньня аб'екта з пэўнай мэтаю. Пры [[Намінатыўная тыпізацыі|намінатыўнай тыпізацыі]] аб'ект належыць да дадзенага тыпу, калі ён аб'яўлены як такі (або калі асацыяцыя тыпу з аб'ектам вызначаецца праз такія мэханізмы, як [[Спадкаваньне (праграмаваньне)|спадкаваньне]]). Пры качынай тыпізацыі - калі ён мае ўсе неабходныя для гэтага тыпу [[Мэтад (праграмаваньне)|мэтады]] і ўласьцівасьці. Качыную тыпізацыю можна разглядаць як структурную эквівалентнасць паміж дадзеным аб'ектам і патрэбным тыпам.
 
== Прыклад ==
Наступны прыклад на [[Python]] 3 дэманструе, як любы аб'ект можа выкарыстоўвацца ў любым кантэксьце, пакуль ён здольны на тое, што ад яго патрабуюць.<syntaxhighlight lang="python" line="1">
class Duck:
def swim(self):
print("DuckКачка swimmingплыве")
 
def fly(self):
print("DuckКачка flyingляціць")
 
class Whale:
def swim(self):
print("WhaleКіт swimmingплыве")
 
for animal in [Duck(), Whale()]:
animal.swim()
animal.fly()
</syntaxhighlight>Вынік:<syntaxhighlight lang="output">
Качка плыве
Duck swimming
Качка ляціць
Duck flying
Кіт плыве
Whale swimming
AttributeError: 'Whale' object has no attribute 'fly'
</syntaxhighlight>Калі можна ўявіць, што ўсё, што можа плаваць, з'яўляецца качкаю - кіт можа лічыцца качкаю; але, калі таксама патрэбна, каб качка мела здольнасьць лётаць, кіт не можа лічыцца качкаю.
 
== У мовах са статычнай тыпізацыяй ==
У некаторых мовах са [[Статычная тыпізацыя|статычнай тыпізацыяй]], такіх як [[Boo ]] й [[D (мова праграмаваньня)|D]], праверку тыпаў клясаў можна ажыцьцяўляць падчас выканання, а не кампіляцыі.
 
== Параўнанне з іншымі сыстэмамі тыпаў ==
 
=== Структурная тыпізацыя ===
Качыная тыпізацыя мае падобныя рысы са [[Структурная тыпізацыя|структурнай тыпізацыяй]]. Структурная тыпізацыя - гэта [[Статычная тыпізацыя|статычная тыпізацыі]], якая суадносіць тыпы па іх структуры, у той час як качыная тыпізацыя з'яўляецца дынамічнай і суадносіць тыпы толькі па той частцы структуры, да якой звяртаюцца падчас выкананьня.
 
Мовы [[TypeScript]], [[Elm]] і [[Python]] у той ці іншай ступені падтрымліваюць структурную тыпізацыю.
 
=== Пратаколы й інтэрфэйсы ===
[[Інтэрфэйс (аб'ектна-арыентаванае праграмаваньне)|Пратаколы й інтэрфэйсы]] дазваляюць яўна вызначыць мэтады, апэратары й паводзіны аб'екта. Калі зьнешняя бібліятэка рэалізуе нязменную клясу, кліент не можа карыстацца яе экзэмплярам з інтэрфейсам, невядомым гэтай бібліятэцы, нават калі кляса задавальняе патрабаваньням інтэрфэйса. Вядомым вырашэньнем гэтае праблемы з'яўляецца [[Адаптэр (патэрн праграмаваньня)|патэрн АдаптарАдаптэр]]. У супрацьлегласць гэтаму, пры качынай тыпізацыі аб'ект будзе прыняты непасрэдна без неабходнасьці адаптараадаптэра.
 
=== Шаблённыя тыпы ===
[[Шаблённае праграмаваньне|Шаблённыя функцыі]] або мэтады прымяняюць качыны тэст у кантэксьце статычнай[[Статычная тыпізацыя|статычнае тыпізацыі]], што сумяшчае ўсе перавагі і недахопы як статычнае так і дынамічнае праверкі тыпаў. Як больш гнуткая качыная тыпізацыя дазваляе рэалізаваць толькі мэтады фактычна выклікаемыя падчас выканання, у той час як шаблёны патрабуюць рэалізацыі ўсіх мэтадаў, нават калі яны застануцца нявыкарыстанымі.
 
У такіх мовах, як [[Java]], [[Scala (мова праграмаваньня)|Scala]] і [[Objective-C]], [[Рэфлексія (машыннае праграмаваньне)|рэфлексія]] можа быць выкарыстана для праверкі структуры аб'екта. Напрыклад, Java MethodHandle API можна ўжытае такім чынам.
 
<nowiki>
<nowiki>[[Катэгорыя:Аб'ектна-арыентаванае праграмаваньне]]</nowiki>