![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дочерний класс со ссылкой на родителя
Nucer © (2008-08-21 17:22:00)Есть два класса: TField и TRobots.
Файл uField.pas:
unit uField;
interface
uses
Windows, Messages, SysUtils, Classes, fs_iinterpreter, uRobots;
type
TField = class(TObject)
private
FRobots:TRobots;
FScript:TfsScript;
public
property robots: TRobots read FRobots;
...
constructor Create;
destructor Destroy; override;
end;
implementation
constructor TField.Create;
begin
FRobots:=TRobots.Create(self);
end;
destructor TField.Destroy;
begin
FRobots.Free;
FRobots:=nil;
end;
end.
Файл uRobots.pas:
unit uRobots;
interface
uses
Windows, Messages, SysUtils, Classes;
type
TField = class(TObject);
TRobots = class(TObject)
private
FField:TField;
...
public
...
constructor Create(field:TField);
destructor Destroy; override;
end;
implementation
uses uField;
constructor TRobots.Create(field:TField);
begin
FField:=Field;
...
end;
destructor TRobots.Destroy;
begin
...
end;
end.
При компиляции получаю ошибку:
[Error] uField.pas(26): Incompatible types: 'uRobots.TField' and 'uField.TField'
Как исправить?
Ega23 (2008-08-21 17:54:00) [1]
> Этого никак нельзя добиться малой кровью?
Создать TCustomField, в котором описать те методы, которые будут использоваться в TRobot. Соответственно, TRobot знает только про существование TCustomField.
Ну а ты уже наследуешься от TCustomField в другом юните и переопределяешь (если надо) нужные тебе методы.
З.Ы. А много кода это сколько? 20.000 строк?
stas (2008-08-21 17:47:00) [2]ниже объяви,то что в другом модуле и будет работать.
Nucer (2008-08-21 17:47:00) [3]Да, сейчас проверил, если все скинуть в один модуль и добавить TField = class, то работает. Но хотелось бы разбить на 2 файла, т.к. кода будет много. Этого никак нельзя добиться малой кровью?
stas (2008-08-21 17:45:00) [4]У меня так работает, правда все в одном модуле.
Nucer (2008-08-21 17:44:00) [5]>а так надо TField = class;
Получаю:
Type 'TField' is not yet completely defined
stas (2008-08-21 17:41:00) [6]там вроде ненадо писать TField = class(TObject);
а так надо TField = class;
Nucer (2008-08-21 17:39:00) [7]>А зачем ты их по разным модулям разносишь? Им самое место быть в едином модуле.
Все равно один класс будет объявлен ниже, и получится "undeclared identifier". Или это как-то можно обойти?
Ega23 (2008-08-21 17:35:00) [8]А зачем ты их по разным модулям разносишь? Им самое место быть в едином модуле.
Nucer (2008-08-21 17:32:00) [9]>А почему не объявить Ufield вверху?
Потому что будет другая ошибка:
[Fatal Error] uField.pas(6): Circular unit reference to 'uField'
stas (2008-08-21 17:27:00) [10]А почему не объявить Ufield вверху?
ЛшдлуттнСфе (2008-08-21 17:24:00) [11]не объявлять лишний раз.