|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Пример. Delphi (Lazarus)
TList1 = class (TObject) Private pHead: pPersonType; nItems: integer; procedure DeleteTail(pFirstInTail: pPersonType); function ItemsCountR: integer; procedure ItemsCountW(k: integer); Public property ItemsCount: integer read ItemsCountR write ItemsCountW; end;
procedure TList1.DeleteTail(pFirstInTail: pPersonType); Var pCurr, pDelete: pPersonType; Begin pCurr:= pFirstInTail; while pCurr <> Nil do Begin pDelete:= pCurr; pCurr:= pCurr^.pNext; Dispose(pDelete); end; end; Var pCurr: pPersonType; n: integer; Begin // ItemsCountR:= nItems; pCurr:= pHead; n:= 0; while pCurr <> Nil do Begin Inc(n); pCurr:= pCurr^.pNext; end; nItems:= n; ItemsCountR:= n; end; procedure TList1.ItemsCountW(k: integer); Var pCurr, pPrev: pPersonType; n: integer; Begin // nItems:= k; if k < 0 then Begin writeln(‘k must be non-negative!’); exit; end;
pCurr:= pHead; n:= 0; while (pCurr <> Nil) and (n < k) do Begin Inc(n); pPrev:= pCurr; pCurr:= pCurr^.pNext; end;
if n < k then Begin writeln(‘k must be less or equal to ’, n:0, ‘!’); exit; end;
pPrev^.pNext:= Nil;
if pCurr <> Nil then DeleteTail(pCurr);
nItems:= k; end;
Дополнительно о полиморфизме
Как уже говорилось, каждый класс может иметь несколько конструкторов и несколько деструкторов. Правила языка Delphi этого не запрещают. Однако, среди программистов есть разные точки зрения на то, следует ли разрешать использовать несколько конструкторов и деструкторов. Ниже приводится фрагмент текста для модуля Unit1.pas, в котором предусмотрено два деструктора.
В разделе интерфейса имеется два заголовка процедуры destructor. Наличие двух заголовков сопровождается словами «overload» после них. destructor Destroy; overload; destructor Destroy(sFileName: string); overload; Списки формальных параметров у заголовков должны быть такими, чтобы не было «двусмысленности», т.е. чтобы компилятор мог однозначно определить по списку фактических параметров, какой из двух разных кодов для процедуры с одним именем следует применить.
В разделе реализации тексты двух деструкторов могут выглядеть так:
destructor MyList1Class.Destroy; Begin DeleteTail(pHead); inherited Destroy; ShowMessage('Список убит!'); end;
destructor MyList1Class.Destroy(sFileName: string); Var F: Text; Begin AssignFile(F,sFileName); Rewrite(F);
pTail:= pHead; while pTail <> Nil do Begin Writeln(F,pTail^.sName); Writeln(F,pTail^.Salary:0:2); pTail:= pTail^.pNext; end;
Close(F);
DeleteTail(pHead);
inherited Destroy;
ShowMessage('Список перенесен в файл ' + sFileName); end;
Первый из деструкторов уничтожает список безвозвратно. Второй деструктор сначала сохраняет содержимое списка в файле, затем только удаляет его из оперативной памяти. Процедура DeleteTail имеет следующий код:
procedure MyList1Class.DeleteTail(pFirstInTail: pPersonType); Var pCurr, pDelete: pPersonType; Begin pCurr:= pFirstInTail; while pCurr <> Nil do Begin pDelete:= pCurr; pCurr:= pCurr^.pNext; Dispose(pDelete); end; end;
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.009 сек.) |