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

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі
Змесціва выдалена Змесціва дададзена
Старонка замененая на 'Иди лесом!'
Czalex (гутаркі | унёсак)
Undo revision 199065 by Вася Тяпкин (Talk)
Радок 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:类 (计算机科学)]]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Віды клясаў

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

Прыклады

С++

#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;
}

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

Java

Прыклад 1

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

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

Прыклад 2

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

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

  public int getData()
  {
    return data;
  }

  public void setData(int d)
  {
    data = d;
  }
}

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

PHP

Прыклад 1

<?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";
       }
   }
}
?>

Прыклад 2

<?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';
   }
}
?>

C#

Прыклад 1

using System;
 
public class Program
{
    public static void Main(string[] args)
    {
        System.Console.WriteLine("Hello world!");
    }
}

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

Прыклад 2

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!" на кансоль
    }
}

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

Object Pascal/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;

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;