Заголовок класса включает имя класса и директиву classи объявляется в разделе описания типов следующим образом:
typeИмяКласса= class
После директивы classсразу начинается тело класса, содержащее в произвольном порядке перечень свойств и заголовки методов. Порядок следования директив public и private и их количество не имеют значения. Каждая директива относится ко всем последующим элементам класса до появления другой директивы.
Конструкторы задаются с помощью директивы constructor. Класс может иметь любое количество конструкторов. Разные конструкторы по-разному могут инициализировать создаваемые объекты. На практике часто используются классы с двумя конструкторами: первый устанавливает свойства создаваемого объекта в значения по умолчанию, второй – в значения, передаваемые через входные параметры конструктора. Конструкторам можно давать любые имена. Стандартным именем является Create. Все одноименные (перегруженные) методы должны иметь в заголовке директиву overload. Деструктор в классе один, обозначается директивой destructor и имеет имя Destroy.
Set-методы оформляются как процедуры, принимающие необходимые входные параметры. Get-методы оформляются как функции, возвращающие значения запрашиваемого свойства. Программная реализация методов обычно выносится за рамки класса. При этом заголовок метода обязательно должен содержать имя класса и через точку – имя метода:
procedure ИмяКласса.ИмяМетода (параметры);
Разделение описания класса и программной реализации методов целесообразно потому, что позволяет помещать описание класса в открытой (интерфейсной) части программного модуля, тогда как реализация методов размещается в закрытом разделе реализации и после компиляции распространяется в двоичном коде.
Свойства класса объявляются с помощью комбинации директив classvar (только для версии Delphi 2005/2006), а методы класса – с помощью одной директивы class.
В качестве примера рассмотрим описание класса окружностей, оформив для этого отдельный программный модуль:
Unit Circle; // заголовок модуля
interface// открытый раздел модуля
Type
TCircle = class // заголовок класса
private // закрытые свойства
x, y : integer; // координаты центра
r : integer; // радиус окружности
public // открытые методы
constructorCreate; overload;
constructor Create (ax, ay, ar : integer); overload;
destructor Destroy;
function GetX : integer;
function GetY : integer;
function GetR : integer;
function Length : real; // подсчет длины окружности
procedure SetXY (ax, ay : integer);
procedure SetR (ar : integer);
procedure MoveTo (ax, ay : integer); // метод перемещения
procedure Show; //метод прорисовки окружности
end; // конец описания класса
implementation// закрытый раздел модуля
// для простоты реализация некоторых очевидных методов пропущена
constructor TCircle.Create (ax, ay, ar : integer); // другая реализация
Begin
x := ax; y := ay; r := ar;
end;
function TCircle.GetX : integer;
Begin
result := x; // result – внутренняя переменная языка DP
end;
function TCircle.Length : real;
Begin
result := 6.28*r;
end;
procedure TCircle.MoveTo (ax, ay : integer);
Begin
«если окружность нарисована, то стереть ее»;
x := ax; y := ay;
// а иначе - можно вызвать метод SetXY (ax, ay);
Show;
end;
procedure TCircle.Show;
Begin
«отображение окружности»;
end;
end;
Из этого примера видно, что программный код методов может напрямую оперировать со свойствами класса и вызывать другие методы класса, используя только их имена.
2. Язык C++
Заголовок класса включает имя класса и директиву class. Все конструкторы класса имеют одно и то же имя, совпадающее с именем класса. Деструктор только один, его имя также совпадает с именем класса, но перед именем ставится символ ~ (тильда, волнистая черта). Директивы public и private используются так же, как и в языке DP. Программную реализацию методов можно либо вынести за пределы класса, либо вставить сразу за заголовком метода. Для вынесенной реализации в заголовке обязательно надо сначала указать имя класса. Классовые (статические) свойства и методы объявляются с помощью директивы static.
Пример для класса окружностей (некоторые методы пропущены):
class Circle
{ private:
int x; int y; int r;
public:
Circle ( ); // конструктор без параметров
Circle (int ax, int ay, int ar); // конструктор с тремя параметрами
Circle (int, int); // конструктор с двумя параметрами
int GetX ( ) { return x}; // встроенная реализация метода
void SetXY (int ax, int ay) {x = ax; y = ay}; // аналогично
void MoveTo (int ax, int ay); // реализация вынесена за тело класса
void Show ( ); // аналогично
~Circle( ); // деструктор
}; // конец тела класса
Программная реализация некоторых методов за пределами класса:
Circle::Circle ( ) // реализация конструктора без параметров
{x = 0; y = 0; r = 0};
Circle::MoveTo (int ax, int ay) // реализация метода перемещения
{«стереть»; SetXY(ax, ay); Show ( ); };
3. Языки Java и С#
Описание класса похоже на С++ за несколькими отличиями:
· каждый элемент класса имеет свою собственную директиву public или private;
· все реальные (т.е. не абстрактные) методы обязательно должны быть программно реализованы внутри класса сразу за своим заголовком, т.е. все методы полностью определяются в теле класса;
· деструкторы не используются, т.к. в язык Java и платформу .NET встроен механизм «сборки мусора», т.е. освобождение памяти из-под неиспользуемых объектов производится автоматически лишь при нехватке памяти.
Пример описания класса окружностей (некоторые методы пропущены):
class Circle
{ private int x;
private int y;
private int r;
public Circle ( ) {x = 0; y = 0; r = 100 ;}
public Circle (int ax, int ay, int ar) {x = ax; y = ay; r = ar ;}