Кляса (праграмаваньне): розьніца паміж вэрсіямі

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі
Змесціва выдалена Змесціва дададзена
дНяма апісаньня зьменаў
Старонка замененая на 'Иди лесом!'
Радок 1: Радок 1:
Иди лесом!
{{Іншыя значэньні|Кляса}}

У [[аб'ектна-арыентаванае праграмаваньне|аб'ектна арыентаваным праграмаваньні]] '''кляса''' — канструкцыя [[мова праграмаваньня|мовы праграмаваньня]], якая выкарыстоўваецца для групаваньня зьвязаных [[поле (праграмаваньне)|палёў]] і [[мэтад (праграмаваньне)|мэтадаў]] і пад якой разумеецца пэўная сутнасьць, якая вызначае пэўныя агульныя паводзіны для [[аб'ект (праграмаваньне)|аб'ектаў]]. Мэтад, які ў пэўных мовах праграмаваньня называецца функцыяй, — набор інструкцый, якія маюць дачыненьне да клясы. У залежнасьці ад мовы праграмаваньня, клясы могуць падтрымліваць [[множнае спадкаваньне|множнае]] [[спадкаваньне (праграмаваньне)|спадкаваньне]] або патрабаваць выкарыстаньне [[інтэрфэйс (праграмаваньне)|інтэрфэйсаў]] для пашырэньня іншых клясаў. Таксама кляса можа проста паказваць, што пэўны мэтад існуе. Такія клясы вядомыя як «абстрактныя клясы».

Фактычна [[аб'ектна-арыентаванае праграмаваньне]] часьцей за ўсё зводзіцца да стварэньня пэўнага набору клясаў, апісаньня сувязяў паміж гэтымі клясамі і іх уласьцівасьцяў і далейшага выкарыстаньня атрыманых клясаў. [[аб'ектна-арыентаванае праграмаваньне|Аб'ектна-арыентаваны падыход]] падчас свайго разьвіцьця накапіў мноства рэкамэндацыяў ([[шаблёны праектаваньня|шаблёнаў праектаваньня]]) па стварэньні клясаў і гіерархій клясаў.

== Структура клясаў ==

У шматлікіх [[аб'ектна-арыентаваная мова праграмаваньня|аб'ектна-арыентаваных мовах праграмаваньня]] стварэньне клясы адбываецца шляхам напісаньня пэўнай структуры, якая ўтрымлівае набор палёў, мэтадаў і канструктараў.

Функцыі [[канструктар (праграмаваньне)|канструктара]] і [[дэструктар (праграмаваньне)|дэструктара]] ў рэалізацыі клясы прызначаныя для стварэньня і разбурэньня [[аб'ект (праграмаваньне)|аб'ектаў]] клясы. Асноўная функцыя канструктара — стварыць правільны экзэмпляр клясы. Асноўная функцыя дэструктара — разбурыць аб'ект і прыбраць усе спасылкі на яго ў [[праграма|праграме]].

[[поле (праграмаваньне)|Палі]] прызначаныя для захоўваньня ўнутраных дадзеных клясы, а [[мэтад (праграмаваньне)|мэтады]] — для іхнай апрацоўкі, рэалізацыі лёгікі і ўзаемадзеяньня зь іншымі клясамі.

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

=== Спэцыфікатары доступу ===

Мэтады і палі клясы могуць быць спраектаваныя як public, private або protected. Гэтыя парамэтры называюцца спэцыфікатарамі доступу. Яны вызначаюць, хто можа атрымліваць доступ да мэтадаў і палёў клясы, якія апісаныя пры дапамозе спэцыфікатара доступу.

'''Private''' ([[Ангельская мова|анг.]] асабісты) абмяжоўвае доступ для ўсіх, апроч самой клясы. Толькі мэтады, якія зьяўляюцца часткай самой клясы, могуць атрымліваць доступ да такіх палёў ці мэтадаў.

'''Protected''' ([[Ангельская мова|анг.]] абаронены) дазваляе самой клясе і ўсім ейным падклясам зьвяртацца да палёў і мэтадаў клясы.

'''Public''' ([[Ангельская мова|анг.]] агульны) азначае, што ўсе могуць атрымаць доступ да поля ці мэтада клясы па ейным імені.

У дадатак, некаторыя мовы праграмаваньня, напрыклад [[C++]], падтрымліваюць мэханізм, калі функцыя ці кляса, апісаныя як сябар клясы, могуць атрымліваць доступ да яе палёў і мэтадаў, вызначаных як private і protected.

== Адносіны між клясамі ==

* [[спадкаваньне (праграмаваньне)|Спадкаваньне]] — аб'екты адной клясы (нашчадка) спадкуюць усе ўласьцівасьці іншай клясы (продка)
* Асацыяцыя — аб'екты клясаў узаемадзейнічаюць адзін з адным.
* Агрэгацыя — аб'екты адной клясы ўваходзяць у склад іншай клясы.
* Кампазыцыя — аб'екты адной клясы ўваходзяць у склад іншай клясы і залежаць адзін ад аднога па часе жыцьця.
* Кляса-мэтакляса — адносіны, пры якіх экзэмплярамі адной клясы зьяўляюцца іншыя клясы.

== Віды клясаў ==

* Базавая (бацькоўская) кляса
* Вытворая кляса (нашчадак)
* Абстрактная (віртуальная) кляса

== Прыклады ==

=== [[С++]] ===

<source lang="cpp">
#include <iostream>
#include <string>
class Hello
{
std::string what;

public:
Hello(const char* s)
: what(s)
{
}
void say()
{
std::cout << "Hello " << what << "!" << std::endl;
}
};
int main( int argc, char** argv )
{
Hello hello_world("world");
hello_world.say();

return 0;
}
</source>

Гэты прыклад паказвае, як на C++ стварыць клясу з назвай «Hello». Яна мае прыватнае радковае поле з назвай «what» і агульны мэтад з назвай «say».

=== [[Java]] ===

==== Прыклад 1 ====

<source lang="java">
public class Example1
{
// Гэта кляса на мове Java, яна аўтаматычна паходзіць ад клясы Object
public static void main (String args[]) {
System.out.println("Hello world!");
}
}
</source>

Гэты прыклад паказвае, як апісаць самую простую Java-клясу.

==== Прыклад 2 ====

<source lang="java">
public class Example2 extends Example1
{
// Гэта кляса, якая паходзіць ад клясы, створанай у першым прыкладзе.
protected int data;

public Example2()
{
// Гэта канструктар клясы. Ён не вяртае ніякага значэньня.
data = 1;
}

public int getData()
{
return data;
}

public void setData(int d)
{
data = d;
}
}
</source>

Гэты прыклад паказвае клясу, якая мае вызначаны канструктар, адно поле дадзеных, мэтад атрыманьня доступу да дадзеных (getData) і мэтад зьмяненьня дадзеных (setData) для поля. Яна пашырае клясу, прыведзеную ў папярэднім прыкладзе. У Java усе клясы аўтаматычна паходзяць ад клясы Object. Гэта стварае магчымаць пісаць унівэрсальны код, які можа працаваць з аб'ектамі любога тыпу.

=== [[PHP]] ===
==== Прыклад 1 ====
<source lang="php">
<?php
class A {
public function foo() {
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this is not defined.\n";
}
}
}
?>
</source>

==== Прыклад 2 ====
<source lang="php">
<?php
class date {

var $date;

function __construct() {
$this->date = date('c');
}

private function getDate() {
return $this->date;
}

public function printDate() {
echo 'Todays Date is ' . $this->getDate() . '\n';
}
}
?>
</source>

=== [[C#]] ===
==== Прыклад 1 ====
<source lang="csharp">
using System;
public class Program
{
public static void Main(string[] args)
{
System.Console.WriteLine("Hello world!");
}
}
</source>

Гэты прыклад дэманструе традыцыйна прыклад «Hello world!» на мове [[C#]]. Кляса Program складаецца з адзінага статычнага мэтада Main(), які выклікае System.Console.WriteLine, каб вывесьці тэкст на кансоль.

==== Прыклад 2 ====
<source lang="csharp">
using System;
public class Hello
{
private string what;
public Hello(string s)
{
what = s;
}
public void Say()
{
Console.WriteLine("Hello " + what + "!");
}
}

public class Program
{
public static void Main(string[] args)
{
Hello helloWorld = new Hello("world");
helloWorld.Say(); // выводзіць "Hello world!" на кансоль
}
}
</source>

Гэта згаданы вышэй прыклад на мове C++, перапісаны на мове C#. Кляса, якая называецца Hello, ствараецца канструктарам, які прымае радковы парамэтар. Калі выклікаецца мэтад Say(), экзэмпляр клясы Hello выведзе «Hello {what}!» на кансоль. Тут варта зьвярнуць увагу на тое, што мэтад Main() (кропка ўваходу) утрымліваецца ў самой клясе.

=== [[Object Pascal]]/[[Delphi]] ===
<source lang="delphi">
type
THello = class(TObject)
private
FWhat: string;
public
procedure Hello(s:string);
procedure Say;
end;
procedure THello.Hello(s:string);
begin
FWhat := s;
end;
procedure THello.Say;
begin
WriteLn('Hello ' + FWhat + '!');
end;
procedure SayHello;
begin
with THello.Create do
begin
Hello('world');
Say;
Free;
end;
end;
</source>

=== [[Oberon-2]] ===
TYPE
HelloObj = RECORD
what: ARRAY 32 OF CHAR
END;
PROCEDURE (hello:HelloObj) Hello(s: ARRAY OF CHAR)
BEGIN
COPY(what, s);
RETURN
END Add;
PROCEDURE (hello:HelloObj) Say(s: ARRAY OF CHAR)
BEGIN
InOut.WriteStr(what);
RETURN
END Add;

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

[[af:Klasse]]
[[bs:Računarska klasa]]
[[ca:Classe (informàtica)]]
[[cs:Třída (programování)]]
[[da:Klasse (datalogi)]]
[[de:Klasse (objektorientierte Programmierung)]]
[[en:Class (computer science)]]
[[eo:Klaso (objektema programado)]]
[[es:Clase (informática)]]
[[fa:کلاس (برنامه‌نویسی)]]
[[fi:Kapselointi]]
[[fr:Classe (informatique)]]
[[he:מחלקה (תכנות)]]
[[is:Klasi (forritun)]]
[[it:Classe (informatica)]]
[[ja:クラス (コンピュータ)]]
[[lt:Klasė (programavimas)]]
[[nl:Klasse (informatica)]]
[[pl:Klasa (programowanie obiektowe)]]
[[pt:Classe (programação)]]
[[ru:Класс (программирование)]]
[[simple:Class (programming)]]
[[su:Class (élmu komputer)]]
[[sv:Klass (programmering)]]
[[ta:வகுப்பு (கணினியியல்)]]
[[th:คลาส]]
[[uk:Клас (програмування)]]
[[vi:Lớp (khoa học máy tính)]]
[[zh:类 (计算机科学)]]

Вэрсія ад 09:45, 26 красавіка 2008

Иди лесом!