![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Предобъявление классов в Object Pascal
Igor_ © (2005-11-30 11:02:00)Как реализовать предобъявление класса?
У меня есть классы типа этого:
type TChild = class
..
function getParent: TParent;
..
end;
type TParent = class
..
function childByIndex(i: integer): TChild;
..
end;
Естественно, что на объявлении функции
function TChild.getParent: TParent;
компилятор ругается.
Как предобъявить класс TParent? И возможна ли такая конструкция
в Object Pascal.
Если нет такого понятия как "предобъявить" (я по инету, книжкам,
хелпу искал - не нашел.. Может плохо искал..), то чего-бы такого сделать,
чтобы было и красиво и удобно?
Igor_ (2005-11-30 13:16:00) [1]Спасибо, Вам того же. :)
Ega23 (2005-11-30 13:14:00) [2]Всего наилучшего, Igor_
Igor_ (2005-11-30 13:11:00) [3]Нет, лучше отвечать тупыми ответами. Ни один Ваш ответ не был верным.
Удалят тему.. И правильно сделают..
Ega23 (2005-11-30 12:55:00) [4]
> Это тоже тупо.
Тупые вопросы задавать - тоже тупо? :о)
Igor_ (2005-11-30 12:53:00) [5]Это тоже тупо.
Ega23 (2005-11-30 12:51:00) [6]
> Смысла обсуждать какой язык лучше не вижу. Это тупо.
Согласен. Но я и не говорил о том, какой язык лучше. Я говорил о том, какой - хуже. :о)
Igor_ (2005-11-30 12:48:00) [7]Смысла обсуждать какой язык лучше не вижу. Это тупо.
Я просто говорил про различия.
Ega23 (2005-11-30 12:46:00) [8]
> а в каком модуле - без разницы.
>
Глупость какая...
Ненавижу С++. Как раз за эти долбаные хидеры.
Igor_ (2005-11-30 12:10:00) [9]
> Модуль - самостоятельная единица со своим интерфейсом. Делать
> каки-либо предположения о том КТО использует этот модуль
> не стоит. А КАК кто-то его использует - польностью описано
> в интерфейсной части. Такая вот идеология. И ничего странного
> и нехорошего я тут как-то не вижу.
Согласен, смысл в этом есть.
Просто я последнее время больше с С++ работал - там это вообще не вопрос. Захотел - предобъявил, хочешь использовать - напиши реализацию, а в каком модуле - без разницы.
TUser (2005-11-30 11:55:00) [10]Если вы предопределяете класс, то его описание должно находиться в той же секции type.
wal (2005-11-30 11:47:00) [11]
> Хотя с модулями все равно как-то нехорошо...
Модуль - самостоятельная единица со своим интерфейсом. Делать каки-либо предположения о том КТО использует этот модуль не стоит. А КАК кто-то его использует - польностью описано в интерфейсной части. Такая вот идеология. И ничего странного и нехорошего я тут как-то не вижу.
С уважением.
Igor_ (2005-11-30 11:42:00) [12]Спасибо TUser и evvcom.
Стало немного легче жить.
Хотя с модулями все равно как-то нехорошо...
Igor_ (2005-11-30 11:37:00) [13]2 evvcom ©
Не пройдет. Если используешь предъобъявление класса, то его объявление должно быть в той же секции type.
И по другому не как?
Igor_ (2005-11-30 11:36:00) [14]Красиво куча type или нет, это дело вкуса.
А вот насчет uses - маленько не выходит:
Если пишу так:
unit u_child;
interface
type TParent = class;
TChild = class
function getParent: TParent;
end;
implementation
function TChild.getParent: TParent;
begin
result := Nil;
end;
end.
Ошибка [Error] u_child.pas(5): Type 'TParent' is not yet completely defined
А если так:
unit u_child;
interface
uses
u_parent;
...
То такая ошибка:
[Fatal Error] u_child.pas(5): Circular unit reference to 'u_child'
При этом модуль u_parent:
unit u_parent;
interface
uses
u_child;
type
TChild = class;
TParent = class
function childByIndex(i: integer): TChild;
end;
implementation
function TParent.childByIndex(i: integer): TChild;
begin
result := Nil;
end;
end.
Что за фигня? И как с этим бороться?
evvcom (2005-11-30 11:31:00) [15]
> > А что делать, если классы находятся в разных модулях?
>
>
> На это uses есть.
Не пройдет. Если используешь предъобъявление класса, то его объявление должно быть в той же секции type.
Ega23 (2005-11-30 11:26:00) [16]
> А что делать, если классы находятся в разных модулях?
На это uses есть.
А кучу type писать - ИМХО, некрасиво.
Igor_ (2005-11-30 11:22:00) [17]Не, немножко не так.
Вот так заработало:
type TParent = class;
TChild = class
function getParent: TParent;
end;
TParent = class
function childByIndex(i: integer): TChild;
end;
Не думал, что инструкция type играет тут какую-то глубокую роль...
Получается, что если у нас объявления этих классов в одной инструкции
type, то все нормально.
А что делать, если классы находятся в разных модулях?
TUser (2005-11-30 11:17:00) [18]Перепиши вот так
type TParent = class;
TChild = class
..
function getParent: TParent;
..
end;
type TParent = class
..
function childByIndex(i: integer): TChild;
..
end;
Igor_ (2005-11-30 11:13:00) [19]На что получаем сообщение компилятора:
[Error] u_some.pas(11): Type 'TParent' is not yet completely defined
Ega23 (2005-11-30 11:08:00) [20]
type TParent = class;
type TChild = class
..
function getParent: TParent;
..
end;
type TParent = class
..
function childByIndex(i: integer): TChild;
..
end;