Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

Метод при наследовании   Найти похожие ветки 

 
Sam Stone ©   (2005-11-14 21:50) [0]

Есть код:

TBaseClass = class(TObject)
private
 FName:string;
 FList:TList;
public
 procedure Add(p:pointer);
 procedure Delete(i:integer);
 function GetObjectByName(AName:string):pointer;
 property Items:TList read FList write FList;
end;
THerb = class(TBaseClass)
//специфические поля(детализация)
End;
TPotion = class(TBaseClass)
//специфические поля
End;
TMainFrame = class(TBaseClass)
private
 FHerbs:TList;
 FPotions:TList;
public
 procedure MyProc;
end;
//---------------------

procedure TMainFrame.MyProc;
p:pointer;
begin
...
 p:=GetObjectByName("name");
 THerb(Herbs[i]).Add(p);// <<================
...
end;
function TBaseClass.GetObjectByName(AName:string):pointer;
var i:integer;
begin
 i:=0;
 result:=nil;
 while i<FList.Count do
   if AName=TBaseClass(Items[i]).Name then begin
     result:=FList[i];
     i:=FList.Count;
   end else
     inc(i);
end;

Но в случае работы процедуры TMainFrame.MyProc в функции GetObjectByName() работа просходит с TMainFrame.FList, а надо обратиться к списку объекта THerbs или TPotion. Подскажите, как доползти.
Извращения типа TBaseClass(TList(Items[K])[i]).GetObjByName() не помогли ;)  (пояснение: в конструкторе MainFrame я в FList добавляю FHerbs и FPotions (Items[k] - указатель на соотв. список), чтобы можно было легко в цикле делать предварительную обработку. Можно было бы просто скопировать код, подставив определенную процедуру, но я для примера привел только два класса. Остальные аналогично выглядят)


 
Digitman ©   (2005-11-15 10:02) [1]

что-то ты наблудил изрядно с деревом наследования ..


 
jack128 ©   (2005-11-15 10:32) [2]

Sam Stone ©   (14.11.05 21:50)
while i<FList.Count do
  if AName=TBaseClass(Items[i]).Name then begin
    result:=FList[i];
    i:=FList.Count;
  end else
    inc(i);

оригинально :-)

Sam Stone ©   (14.11.05 21:50)
GetObjectByName() работа просходит с TMainFrame.FList, а надо обратиться к списку объекта THerbs или TPotion. Подскажите, как доползти.


создать процедуру

function FindByNameInList(List: Tlist): TBaseClass; // А не Pointer как у тебя было. Нефиг принебригать типизацией.
var
 I: integer;
begin
i := 0;
Result := nil;
while not Assigned(Result) and (i < List.Count) do
begin
  if AName=TBaseClass(List[i]).Name then begin
    Result:=FList[i];
  Inc(I);
end;
end;


соответственно твой метод function TBaseClass.GetObjectByName(AName:string):pointer; сведется к одной строке Result := FindByNameInList(Items) , в MyProc ты должен написать FindByNameInList( <Тот список в котором тебе нужно искать> )


 
Игорь Шевченко ©   (2005-11-15 11:23) [3]

jack128 ©   (15.11.05 10:32) [2]

Сдается мне, ты одно слово забыл. Break;


 
Sam Stone ©   (2005-11-15 19:32) [4]

Ясно. Просто сперва написал, а потом не хотелось капитально код править
> function FindByNameInList(List: Tlist): TBaseClass; // А
> не Pointer как у тебя было. Нефиг принебригать типизацией.
>

В моем случае нет смысла приводить к TBaseClass, потому что в конце работа идет с THerb и прочими типами, чтобы получить доступ к специфическим полям. А указатель нужет только для того, чтобы "соединить" 2 объекта связью.

> while i<FList.Count do
>   if AName=TBaseClass(Items[i]).Name then begin
>     result:=FList[i];
>     i:=FList.Count;
>   end else
>     inc(i);
> оригинально :-)

:-)))) невнимательность :) Но ошибки нет, потому что Items - проперти читающая FList. Зато отдельно смотрится жутко :-D



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.068 c
4-1124891807
Dr.Nemo
2005-08-24 17:56
2005.12.11
Как подловить запуск приложения


2-1133129941
Eksell
2005-11-28 01:19
2005.12.11
Help


14-1132522353
SerJaNT
2005-11-21 00:32
2005.12.11
ACPI


1-1131507885
TFire
2005-11-09 06:44
2005.12.11
Как вытянуть History из Mozilla FireFox ?


2-1132756782
filh
2005-11-23 17:39
2005.12.11
gzip