Мэтад (праграмаваньне)

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

## Віды мэтадаў
Мэтады могуць быць мэтадамі экзэмпляру і мэтадамі клясы. **Мэтады экзэмпляру** належаць канкрэтнаму аб’екту, а **мэтады клясы** альбо **статычныя мэтады** належаць самой клясе. У ва ўсіх тыповых рэалізацыях у мэтады экзэмпляру перадаецца схаваная спасылка (напрыклад, *this*, *self* або *Me*) на аб’ект (кляса альбо экзэмпляр клясы), якому яны належыць, такім чынам мэтады могуць зьвяртацца да зьвестак, асацыяваных з аб’ектам. Для мэтадаў клясы/статычных мэтадаў гэта можа не адбывацца ў залежнасьці ад мовы праграмаваньня. Тыповым прыкладам мэтада клясы зьяўляецца мэтад, які падлічвае колькасьць створаных аб’ектаў дадзенай клясы.

**Абстрактны мэтад** — мэтад, які ня мае рэалізацыі. Часта выкарыстоўваецца як заглушка, якая мусіць быць перавызначаная пазьней у падклясе, якая рэалізуе гэты мэтад. Такім чынам, абстрактныя мэтады дапамагаюць часткова вызначыць канцэптуальную структуру — Framework.

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

Мэтад, які зьмяняе стан аб’екта, называецца **мэтадам абнаўленьня**, альбо **мадыфікатарам**. Аб’екты, якія прадастаўляюць такія мэтады, называюцца зьменлівымі аб’ектамі.

Пэўныя мовы маюць адмысловы сынтаксіс для канструктараў, т.б. мэтадаў, якія аўтаматычна выклікаюцца падчас стварэньня экзэмпляру клясы. У Java, C++, C#, ActionSctipt, PHP яны адрозьніваюцца ад звычайных мэтадаў тым, што маюць такое і імя, як і кляса аб’екта, зь якім яны асацыяваныя. (PHP 5 таксама дазваляе выкарыстоўваць `__construct` для вызначэньня канструктара); у VisualBasic .NET канструктар называецца `New`, а ў Object Pascal канструктары могуць мець назвы, вызначаныя карыстальнікам (але пераважна выкарыстоўваецца назва `Create`). У Objective-C мэтад канструктара падзелены між двума мэтадамі `alloc` і `init`, дзе мэтад `alloc` вылучае памяць для аб’екта клясы, а мэтад `init` ажыцьцяўляе ініцыялізацыю экзэмпляра; звырод да мэтада `new` выклікае абодва мэтады `alloc` і `init` для экзэмпляра клясы.

Падобным чынам, пэўныя мовы маюць адмысловыя мэтады дэструктараў, напрыклад, мэтады экзэмпляра, якія выклікаюцца аўтаматычна падчас зьнішчэньня экзэмпляра клясы. У C++, напрыклад, яны адрозьніваюцца ад звычайных мэтадаў тым, што маюць такое ж імя, як і імя клясы, але з дадаваньнем тыльды (~) у пачатку назвы (або `__destruct` у PHP 5). У Object Pascal дэструктары могуць мець назвы, вызначаныя карыстальнікам (але найчасьцей называюцца `Destroy`). У Objective-C мэтад дэструктара называецца `dealloc`.

## Статычныя мэтады
Як згадвалася вышэй, мэтад можа быць вызначаны як статычны. Гэта азначае, што ён працуе не на ўзроўні экзэмпляра, на ўзроўні клясы. Таму статычныя мэтады ня могуць зьвяртацца да канкрэтнага экзэмпляру клясы (напрыклад, ня могуць зьвяртацца да `this`, `self`, `Me` і г.д.). Прыклад статычнага мэдага і ягонага выкарыстаньня на мове C#:


```java
public class ExampleClass
{
  public static void StaticExample()
  {
     // код статычнага мэтаду
  }
  
  public void InstanceExample()
  {
     // код мэтаду экзэмплара
     // можна выкарыстоўваць THIS
  }   
}

/// Выкарыстаньне вышэйзгаданай клясы:

// Выклік статычнага мэтаду — ніводны экзэмпляр клясы не прыцягнуты
ExampleClass.StaticExample();

// Выклік мэтаду экзэмпляра
ExampleClass objMyExample = new ExampleClass();
objMyExample.InstanceExample();
```


Розьніца ў рэалізацыях статычных мэтадах у розных мовах праграмаваньня часам можа зьбіць з панталыку. Напрыклад мэтады, зададзеныя як `class` у Object Pascal таксама ня могуць зьвяртацца да аб’ектаў сваёй клясы, але гэта могуць рабіць мэтады клясаў у мовах Python або Smalltalk. Напрыклад, гэты код на мове Python можа стварыць экзэмпляр клясы `Dict` альбо любой ейнай падклясы, таму што мэтад клясы атрымлівае спасылку на *аб’ект клясы*, якая называецца `cls`:


```python
class Dict:
   @classmethod
   def fromkeys(cls, iterable, value=None):
       d = cls()
       for key in iterable:
           d[key] = value
       return d
```


## Глядзіце таксама
* Абмен паведамленьнямі
* Кляса (праграмаваньне)

Катэгорыя:Праграмаваньне