Брзо преоптерећење функције (са примерима)

У овом чланку ћете научити о преоптерећењу функција, када нам је потребно преоптерећење функција и како се преоптеретити примерима.

Две или више функција са истим именом, али различитим аргументима, познате су као преоптерећене функције.

Зашто нам је потребно преоптерећење функције?

Замислите да развијате пуцачку игру у којој играч може нападати своје непријатеље ножем, оштрицом и пиштољем. Ваше рјешење за функционалност напада може бити дефинирање акција у функције као:

 func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") ) 

Али када покушате да покренете горњи програм, добићете грешку времена компајлирања у Свифту као 'напад ()' овде претходно декларисан . Међутим, друго решење може бити дефинисање различитих имена функција за одређену функционалност као:

 struct Knife ( ) struct Gun ( ) struct Blade ( ) func attackUsingKnife(weapon:Knife) ( //… print("Attacking with Knife") ) func attackUsingBlade(weapon:Blade) ( //… print("Attacking with Blade") ) func attackUsingGun(weapon:Gun) ( //… print("Attacking with Gun") ) 

Не брините ако не знате шта је структура. За сада само мислите на то као на нешто што ствара физички објекат у програмирању, па стварате нож, пиштољ и оштрицу. Ако желите да сазнате више, погледајте Свифт Струцт. Ако не, вратићемо се на то у каснијим поглављима.

Једини проблем овог решења је што требате упамтити имена функција да бисте позвали ту одређену акцију напада. Такође, како ниво расте, играч може имати додатне функције за напад бомбом, гранатом, сачмарицом итд.

Стварање функције са различитим именима је дуготрајно и повећава опсег памћења имена функције да бисте је позвали. Све у свему, није интуитивно.

Било би много боље када бисте могли да креирате различите функције са истим именом, али различите примене за свако оружје. На овај начин је довољно памтити једно име функције и не бисте морали бринути о именима функција другог оружја.

Шта је преоптерећење функције?

Процес који смо управо описали познат је као преоптерећење функције. По дефиницији, поступак стварања две или више функција са истим именом, али са различитим бројем или врстама прослеђених параметара, познат је као преоптерећење функције.

Да видимо ово у доњем примеру:

Пример 1: Преоптерећење функције

 struct Knife ( ) struct Gun ( ) struct Blade ( ) func attack(with weapon:Knife) ( print("Attacking with Knife") ) func attack(with weapon:Gun) ( print("Attacking with Gun") ) func attack(with weapon:Blade) ( print("Attacking with Blade") ) attack(with: Gun()) attack(with: Blade()) attack(with: Knife()) 

Када покренете горњи програм, излаз ће бити:

 Нападање пиштољем Нападање оштрицом Напад ножем 

У горе наведеном програму створили смо три различите функције са истим именом attack. Међутим, прихвата различите типове параметара. На овај начин attackје довољно запамтити име за позивање функције.

  • Позив attack(with: Gun())покреће израз унутар функције func attack(with weapon:Gun).
  • Позив attack(with: Blade())покреће израз унутар функције func attack(with weapon:Blade).
  • Израз позива attack(with: Knife())унутар функције func attack(with weapon:Knife).

Пример 2: Преоптерећење функције на основу различитих типова параметара

 func output(x:Int) ( print("The int value is (x)") ) func output(x:String) ( print("The string value is (x)") ) output(x: 2) output(x: "Swift") 

Када покренете горњи програм, излаз ће бити:

 Вредност инт је 2 Вредност низа је Свифт 

У горњем програму имамо две функције са истим именом output()и истим бројем параметара. Међутим, прва output()функција узима цели број као параметар, а друга output()функција узима Stringпараметар.

Слично Примеру 1,

  • позив на output(x: 2)покреће израз унутар функције func output(x:Int)и
  • позив на output(x: "Swift")покреће израз унутар функције func output(x:String).

Пример 3: Преоптерећење функције на основу различитог броја параметара

 func output() ( print("Good Morning!") ) func output(text:String) ( print(text) ) func output(text:String, num:Int) ( print("(text)(num)!") ) output() output(text: "Good Evening!") output(text1: "Good N", num: 8) 

Када покренете горњи програм, излаз ће бити:

Добро јутро! Добро вече! Лаку ноћ!

У горе наведеном програму функција output()је преоптерећена на основу броја аргумената.

Први output()узима никакве параметре, други output()узима један параметар:, Stringа трећи output()узима два параметра: Stringи Int.

Покушајмо да се преоптеретимо променом имена параметра, али задржавајући ознаку аргумента као:

Пример 4: Преоптерећење функције истом ознаком аргумента

 func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello") 

Када покренете горњи програм, излаз ће бити:

 2 Здраво

Као што видите, у горњем програму можете користити исту ознаку аргумента за преоптерећене функције. Међутим, како захтева преоптерећење, морате имати или различит број параметара или различите врсте параметара.

Занимљиви Чланци...