Implementation
var AFirstObj:TFirstObj; // объект класса TFirstObj
ASecondObj:TSecondObj; // объект класса TSecondObj
procedure TSecondObj.Metod4;
begin Metod1; // не допустимо, т.к. Metod1 не доступен
// в другом модуле
Metod2; // допустимо, т.к. класс TSecondObj является
// потомком класса TFirstObj
Metod3; // допустимо, т.к. Metod3 описывается в секции
//public
end;
procedure TestProc2;
begin AFirstObj:=TFirstObj.Create;
AFirstObj.Metod1; // не допустимо т.к. Metod1
//не доступен в другом модуле
AFirstObj.Metod2; // не допустимо т.к. в описании
// Metod2 есть обращение к Metod1
AFirstObj.Metod3; // допустимо
AFirstObj.Free;
end;
.....................
End. // конец модуля Second
Три области видимости private, protected, public упорядочены по возрастанию видимости методов. В классах–потомках можно повысить видимость методов и свойств, но не понизить её.
Создание класса комплексных чисел.
Создадим класс комплексных чисел, в котором реализована комплексная арифметика. Для этого создадим модуль Complex с описанием класса Comp.
Unit Complex;
interface
Uses SysUtils, Dialogs;
Type comp= class
re,im:real;
function modul:real;
// методы ввода и вывода значений действительных части объекта класса Comp
|
|
procedure Impre(x:real);
Function Outre:real;
//методы ввода и вывода значений мнимой части объекта класса Comp
procedure Impim(y:real);
Function Outim:real;
//методы сложения, вычитания и умножения объектов класса Comp
procedure Add(z:comp);
procedure Sub(z:comp);
procedure Mul(z:comp);
end;
Procedure Comp.Impre;
begin re:=x;
end;
procedure Comp.Impim;
begin im:=y;
end;
function Comp.Outre;
begin result:=re;
end;
function Comp.Outim;
begin result:=im;
end;
procedure Comp.Add(z:Comp);
begin re:=re+z.re;
im:=im+z.im;
end;
{Комплексное число z (параметр метода) прибавляется к исходному числу - объекту класса Comp}
procedure Comp.Sub(z: Comp);
begin re:=re – z.re;
im:=im – z.im;
end;
procedure Comp.Mul(z: Comp);
var x:real;
begin x:=re*z.re – im*z.im;
im:=re*z.im + im*z.re;
re:=x;
end;
function Comp.modul;
begin result:=sqrt(sqr(re)+sqr(im));
end;
End.
Заметим, что методы Add, Sub, Mul используются для сложения, вычитания и умножения двух комплексных чисел – объектов класса Comp. Здесь действует правило: при выполнении двуместных операций первым операндом является сам объект (т.е. его поля), вторым операндом – тот который является формальным параметром метода, а результат сохраняется в полях первого операнда.
Запишем программу, которая использует созданные поля и методы класса Comp из Unit Complex для конкретных объектов a и b.
Program Use_Complex;
Uses SysUtils,Dialogs,
Complex in ‘Complex.pas’;
var a,b:Comp;
t:real;
Begin a:=Comp.Create; {конструктор создает объекты a и b}
b:=Comp.Create;
{ Impre и Impim вводят значение действительной и мнимой части объектов a и b}
a.Impre(1);
b.Impre(3);
a.Impim(5);
b.Impim(4);
t:=b.Modul; {объект b вызывает метод Modul }
writeln (‘t=’,t:10:3);
a.Add(b); {объект a вызывает метод Add с параметром b}
writeln (‘Add a=’,a.Outre,‘ ’,a.Outim); {методы Outre и Outim выводят значения суммы объектов a и b }
a.Impre(1);
a.Impim(5);
a.Sub(b);
writeln (‘Sub a=’, a.Outre,‘_’,a.Outim);
a.Impre(1);
a.Impim(5);
a.Mul(b);
writeln (‘Mul a=’, a.Outre,‘_’,a.Outim);
|
|
ShowMessage(‘результат’); {вывод в окно сообщения слова “результат” с кнопкой “ОК”}
b.Free; {уничтожение не нужных объектов методом Free}
a.Free;
End.
Заметим, что в данном примере конструктор и деструктор не описаны при описании класса, поскольку они унаследованы от предка класса Comp – класса TObject.
Создание класса векторов
Создадим модуль VecMat с описанием класса TVect, в котором реализованы основные операции векторной алгебры. В этом модуле будет использовано основное векторное свойство Property Elem.
При инициализации вектора в динамической памяти выделяют участок, в котором последовательно будут размещены его элементы. Указатель Orig на начало этого участка и методы OutElem и InpElem – для записи и чтения значений элементов определены в секции Private, а значит, будут скрыты. Свойство Property Elem определено в секции Public, а значит доступно в других модулях и программах.
Остановимся подробно на следующем:
1. Описание метода определения адреса динамической памяти для j-го элемента вектора – метода ElemP.
Метод ElemP позволяет интерпретировать байты памяти, отведенные под элемент с номером j, как значение вещественного типа. Он записывается в секции protected(защищенной), поэтому он доступен потомкам класса TVect.
При описании метода ElemP используются:
· функция Sizeof(x) – дает размер аргумента x в байтах;
· функция Ptr(x:integer) – стандартная функция типа указатель, которая преобразует адрес памяти (адрес=сегмент+смещение) в указатель.
function TVect.ElemP;
begin ElemP:=Ptr(LongInt(Orig))+(j – jMin)*Sizeof(Real));
end;
вычисляется как функция Ptr от базового адреса (указатель Orig на начало области динамической памяти + смещение на j – jMin, умноженное на размер каждого элемента в байтах). Для обратного преобразования можно использовать явное приведение типов LongInt (p) – преобразует указатель р в целое число типа LongInt. Для размещения этого целого числа будет отведено 4 байта.
2. Заметим, что в данном модуле описывается конструктор и деструктор.
а) описание конструктора:
Constructor TVect.Create(jMin_;jMax_:integer);
begin inherited Create;
{вызов унаследованного конструктора от предка}
jMin:=jMin_;
jMax:=jMax_;
GetMem(Orig,(jMax – jMin + 1)*Sizeof(Real));
Vanish;
end;
процедура GetMem выделяет в динамической памяти область размера (jMax – jMin + 1)*Sizeof(Real) и присваивает адрес этой области указателю Orig.
Метод Vanish – очищает вектор (создает нулевой вектор)
б) описание деструктора:
Destructor TVect.Destroy;
begin FreeMem(Orig,(jMax – jMin + 1)*Sizeof(Real));
{освобождает указатель Orig от адреса данной области памяти}
inherited Destroy;
{вызов унаследованного деструктора от предка TObject }
end;
В классе TObject конструктор – это статический метод, а его деструктор – виртуальный метод, поэтому при перекрытии в классе-потомке TVect деструктор описывается с использованием служебного слова override.
3. Модуль VecMat описывает двухместные операции Add, Sub. Здесь действует соглашение: при выполнении двухместной операции первым операндом является сам объект, вторым операндом – тот, который является формальным параметром метода. Результат сохраняется в полях первого операнда.
Создадим модуль VecMat, в котором описан класс TVect для реализации операций векторной алгебры:
Unit VecMat;
interface // интерфейсная часть
Type Real=extended;
RealP=^Real;
Type TVect=class