Написание модулей обработки данных, не зависящих от их типа (FPC) | |
для FPC 2.2.0 и выше - Generic-и | |
Способ написания подобных модулей для использования в FPC во многом похож на способ, применяемый для
Турбо Паскаля, за исключением того, что FPC позволяет перегрузить операции сравнения и арифметические/логические
операции, благодаря чему использование модулей становится гораздо более удобным.
Рассмотрим, например, случай, описанный здесь: работа с типом запись...
Допустим, мы имеем тот же фрагмент модуля:
Type TType = Integer; TArray = Object ... Function max: TType; Procedure PrintAll; ... End; Function TArray.max: TType; Var maxValue: TType; i: Word; Begin maxValue := arr^[1]; For i := 2 To SizeOfArray Do Begin If arr^[i] > maxValue Then maxValue := arr^[i]; End; max := maxValue End; Procedure TArray.PrintAll; Begin For i := 1 To SizeOfArray Do Write(arr^[i], ' ' ); End;, и хотим добавить работу с типом "Запись":
Type TPoint = Record X, Y: Integer; End;Что для этого придется сделать в FPC? Чтобы ответить на этот вопрос, нужно сначала выяснить, что же препятствует использованию массива TArray совместно с типом TPoint. Давайте посмотрим на приведенный для компилятора TP список проблем:
operator > (const A, B: TPoint) R: Boolean; begin R := (A.X > B.X); end;
procedure write(const R: TPoint); begin system.write('(X:', R.X, ' Y:', R.Y, ')'); end;Для того, чтобы метод PrintAll корректно работал с любым типом данных, его придется немного подкорректировать:
procedure TArray.PrintAll; var i: integer; begin for i := 1 to SizeOfArray do begin Write(arr^[i]); system.Write(' '); end; end;
Unit Arr_Int; interface type TType = Integer; {$i ar_inter.scb} type TArrayInt = TArray; implementation {$i ar_implm.scb} end.
{$mode ObjFPC} unit Arr_Rec; interface type TPoint = record x, y: Integer; end; TType = TPoint; {$i ar_inter.scb} type TArrayPoint = TArray; implementation { Здесь описываем перегрузку операторов и новую процедуру Write } operator > (const A, B: TPoint) R: Boolean; begin R := (A.X > B.X); end; procedure write(const R: TPoint); begin system.write('(X:', R.X, ' Y:', R.Y, ') '); end; {$i ar_implm.scb} end.