Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дочерний класс со ссылкой на родителя


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]

не объявлять лишний раз.


Наверх

Титульная страница Поиск, карта сайта Написать письмо