Чуть кода.
У меня в проекте, есть базовый объект от которого наследуются остальные. Поля next и prev, нужны для реализации универсального списка, для остальных объектов.
- Код: Выделить всё
type
PGameObject = ^TGameObject;
TGameObject = object
Next: PGameObject;
Prev: PGameObject;
end;
Сам список который содержит отнаследованные объекты.
- Код: Выделить всё
type
PList = ^TList;
TList = object
Head: PGameObject;
Tail: PGameObject;
procedure Create();
procedure Append(Elem: PGameObject);
procedure Destroy();
procedure Remove(Elem: PGameObject);
end;
Решил я сделать менеджер ресурсов. И наследовал от TGameObject -> TResource.
- Код: Выделить всё
type
PResource = ^TResource;
TResource = object(TGameObject)
Name: STRING;
end;
От самого, TResource уже наследовать TImage, TAnimation и т.д
Описание менеджера.
- Код: Выделить всё
type
PResourceManager = ^TResourceManager;
TResourceManager = object
Table: ARRAY OF TList;
procedure Init(Size: INTEGER);
procedure Destroy();
function Hash(Src: STRING): INTEGER;
function Find(Src: STRING): PResource;
end;
Простая хеш-таблица, коллизии разрешаются с помощью цепочек, реализованных на том самом TList.
- Код: Выделить всё
function TResourceManager.Find(Src: STRING): PResource;
var
H: INTEGER;
I: PResource; // Здесь проблема ругается, что тип не TGameObject. Почему ругается ведь тип после наследования, грубо говоря один.
begin
H := Hash(Src);
I := Table[H].Head;
while (I <> NIL) and (I^.Name <> Src) do
begin
I := I^.Next;
end;
RESULT := I;
end;
Смысл TResource в записи Name: STRING; где хранится путь до ресурса.
Явно, что, я что то не понимаю и упустил, но как правильно сделать не знаю.