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