>end;
>var
>Line: TLine;
>LineLenght: Double;
>begin
>Line:= TLine. Create;
>Line. X1:= 10;
>Line. Y1:= 10;
>Line. X2:= 20;
>Line. Y2:= 20;
>LineLenght:= CalculateLineLength(Line);
>end;
Тут мы создаём новую линию и рассчитываем её длину. Для этого мы завели вспомогательную функцию CalculateLineLength.
Если приглядется, то в нашей новой функции слишком часто упоминается название переменной Line. Возможно есть способ сделать код несколько проще и наглядней? К счастью да. Дело в том, что функцию можно перенести непосредственно в класс:
>type
>TLine = class(TObject)
>public
>X1: Integer;
>Y1: Integer;
>X2: Integer;
>Y2: Integer;
>function CalculateLineLength: Double;
>end;
>function TLine. CalculateLineLength: Double;
>begin
>Result:= Sqrt(Sqr(X2 — X1) + Sqr(Y2 — Y1));
>end;
В месте использования код также становтся наглядней. Строка LineLenght:= CalculateLineLength(Line); заменится на строку: LineLenght:= Line. CalculateLineLength;, что несколько короче и куда лучше подчёркивает тот факт, что функция относится именно к линии, а не к чему–то ещё.
Отмечу, что на практике, глядя на исходный код, часто возникает потребность понять, что можно сделать с тем или иным классом. Так вот, значительно проще, удобнее и быстрее пройтись по членам класса, чем найти все функции, принимающие класс в качестве параметра.
И немного из терминологии. Функцию член класса принято называть методом. В нашем случае, мы имеем класс с одним методом CalculateLineLength.
В прошлой главе мы создали первый метод. Он вычисляет длину отрезка. На современных машинах это вычисление занимает совсем немного времени, однако, предположим, что действие это не такое быстрое и для каждой линии выполняется многократно.
Есть много способов решения подобной проблемы, но один из самых простых и универсальных — это кэширование.
Действительно, зачем считать длину каждый раз, если это можно сделать единожды, запомнить посчитанное значение и потом, в качестве результата функции, возвращать его.
Вот как это могло бы выглядеть:
>type
>TLine = class(TObject)
>public
>X1: Integer;
>Y1: Integer;
>X2: Integer;
>Y2: Integer;
>LengthCalculated: Boolean;
>LineLength: Double;
>function CalculateLineLength: Double;
>end;
>function TLine. CalculateLineLength: Double;
>begin
>if not LengthCalculated then
>begin
>LineLength:= Sqrt(Sqr(X2 — X1) + Sqr(Y2 — Y1));
>LengthCalculated:= True;
>end;
>Result:= LineLength;
>end;
При всей иллюзии работоспособности, в данном коде присутствует целый спектр проблем. Во–первых, тому, кто будет использовать класс снаружи, будет неочевидно, что необходимо вызывать функцию CalculateLineLength и не корректно напрямую использовать поле LineLength. Ну а во–вторых — нет механизма пересчёта длины при изменении координат точек.
Первую проблему мы решим в этой главе, а вторую оставим для следующей, так как для её решения потребуется познакомиться с ещё одним термином.
Мы уже упоминали, да и не раз сталкивались с ключевым словом public, теперь пришло время рассказать, что оно означает. Члены класса, объявленные как public доступны как внутри класса, так и за его пределами.
Кроме public, есть ещё и ключевое слово private, которое означает, что члены класса доступны только из методов данного класса и не доступны за его пределами. В Object Pascal реализации, используемой в компиляторе Delphi, у данной функциональности есть особенность. Видимость private распространяется не только на членов класса, но и на весь модуль, в котором объявлен класс, что является неким отклонением от общих принципов, но уж так сложилось исторически, ничего не попишешь.
Так или иначе, private члены классов — это некие служебные поля и методы (переменные и функции), не предназначенные для использования за пределами класса.
Давайте посмотрим, как будет выглядеть декларация нашего класса, если мы унесём в private секцию всё лишнее:
>type
>TLine = class(TObject)
>private
>LengthCalculated: Boolean;
>LineLength: Double;
>public
>X1: Integer;
>Y1: Integer;
>X2: Integer;
>Y2: Integer;
>function CalculateLineLength: Double;
>end;
Данная реализация вполне себе красноречиво говорит, что поля LengthCalculated