АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Пример. Delphi (Lazarus)

Читайте также:
  1. ДЛЯ ДОСТИЖЕНИЯ ЗАМЕТНЫХ РЕЗУЛЬТАТОВ НЕОБХОДИМО ВРЕМЯ. — НЕКОТОРЫЕ ТОТЧАС ЖЕ ЗАМЕТНЫЕ СЛЕДСТВИЯ. -ПРИМЕР. — ЧТО ВЫ ДОЛЖНЫ ДЕЛАТЬ
  2. Еще раз повторяю, это пример. Что конкретно здесь говорить, смотрите каждый у себя последний абзац в п.2.4.
  3. На одной странице блокнота пишется только ОДИН пример.
  4. Например.
  5. Например.
  6. ПРИМЕР.
  7. Пример.
  8. Пример.

 

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;
function TList1.ItemsCountR: integer;

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;

 


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.)