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

Вниз

Предобъявление классов в Object Pascal   Найти похожие ветки 

 
Igor_ ©   (2005-11-30 11:02) [0]

Как реализовать предобъявление класса?

У меня есть классы типа этого:


type TChild = class
..
   function getParent: TParent;
..
end;

type TParent = class
..
   function childByIndex(i: integer): TChild;
..
end;


Естественно, что на объявлении функции

function TChild.getParent: TParent;
компилятор ругается.

Как предобъявить класс TParent? И возможна ли такая конструкция
в Object Pascal.

Если нет такого понятия как "предобъявить" (я по инету, книжкам,
хелпу искал - не нашел.. Может плохо искал..), то чего-бы такого сделать,
чтобы было и красиво и удобно?


 
Ega23 ©   (2005-11-30 11:08) [1]



type TParent = class;

type TChild = class
..
  function getParent: TParent;
..
end;

type TParent = class
..
  function childByIndex(i: integer): TChild;
..
end;


 
Igor_ ©   (2005-11-30 11:13) [2]

На что получаем сообщение компилятора:

[Error] u_some.pas(11): Type "TParent" is not yet completely defined


 
TUser ©   (2005-11-30 11:17) [3]

Перепиши вот так

type TParent = class;

TChild = class

..
 function getParent: TParent;
..
end;

type TParent = class
..
 function childByIndex(i: integer): TChild;
..
end;


 
Igor_ ©   (2005-11-30 11:22) [4]

Не, немножко не так.
Вот так заработало:


type TParent = class;

TChild = class
 function getParent: TParent;
end;

TParent = class
 function childByIndex(i: integer): TChild;
end;


Не думал, что инструкция type играет тут какую-то глубокую роль...

Получается, что если у нас объявления этих классов в одной инструкции
type, то все нормально.

А что делать, если классы находятся в разных модулях?


 
Ega23 ©   (2005-11-30 11:26) [5]


> А что делать, если классы находятся в разных модулях?


На это uses есть.

А кучу type писать - ИМХО, некрасиво.


 
evvcom ©   (2005-11-30 11:31) [6]


> > А что делать, если классы находятся в разных модулях?
>
>
> На это uses есть.

Не пройдет. Если используешь предъобъявление класса, то его объявление должно быть в той же секции type.


 
Igor_ ©   (2005-11-30 11:36) [7]

Красиво куча 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.


Что за фигня? И как с этим бороться?


 
Igor_ ©   (2005-11-30 11:37) [8]

2 evvcom ©
Не пройдет. Если используешь предъобъявление класса, то его объявление должно быть в той же секции type.
И по другому не как?


 
Igor_ ©   (2005-11-30 11:42) [9]

Спасибо TUser и evvcom.
Стало немного легче жить.

Хотя с модулями все равно как-то нехорошо...


 
wal ©   (2005-11-30 11:47) [10]


> Хотя с модулями все равно как-то нехорошо...
Модуль - самостоятельная единица со своим интерфейсом. Делать каки-либо предположения о том КТО использует этот модуль не стоит. А КАК кто-то его использует - польностью описано в интерфейсной части. Такая вот идеология. И ничего странного и нехорошего я тут как-то не вижу.

С уважением.


 
TUser ©   (2005-11-30 11:55) [11]

Если вы предопределяете класс, то его описание должно находиться в той же секции type.


 
Igor_ ©   (2005-11-30 12:10) [12]


> Модуль - самостоятельная единица со своим интерфейсом. Делать
> каки-либо предположения о том КТО использует этот модуль
> не стоит. А КАК кто-то его использует - польностью описано
> в интерфейсной части. Такая вот идеология. И ничего странного
> и нехорошего я тут как-то не вижу.

Согласен, смысл в этом есть.
Просто я последнее время больше с С++ работал - там это вообще не вопрос. Захотел - предобъявил, хочешь использовать - напиши реализацию, а в каком модуле - без разницы.


 
Ega23 ©   (2005-11-30 12:46) [13]


> а в каком модуле - без разницы.
>


Глупость какая...
Ненавижу С++. Как раз за эти долбаные хидеры.


 
Igor_ ©   (2005-11-30 12:48) [14]

Смысла обсуждать какой язык лучше не вижу. Это тупо.
Я просто говорил про различия.


 
Ega23 ©   (2005-11-30 12:51) [15]


> Смысла обсуждать какой язык лучше не вижу. Это тупо.


Согласен. Но я и не говорил о том, какой язык лучше. Я говорил о том, какой - хуже.  :о)


 
Igor_ ©   (2005-11-30 12:53) [16]

Это тоже тупо.


 
Ega23 ©   (2005-11-30 12:55) [17]


> Это тоже тупо.


Тупые вопросы задавать - тоже тупо?   :о)


 
Igor_ ©   (2005-11-30 13:11) [18]

Нет, лучше отвечать тупыми ответами. Ни один Ваш ответ не был верным.

Удалят тему.. И правильно сделают..


 
Ega23 ©   (2005-11-30 13:14) [19]

Всего наилучшего, Igor_


 
Igor_ ©   (2005-11-30 13:16) [20]

Спасибо, Вам того же. :)



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

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

Наверх




Память: 0.51 MB
Время: 0.042 c
14-1132779127
ArtemESC
2005-11-23 23:52
2005.12.18
Колонки неработают...


4-1129396275
g-l-u-k
2005-10-15 21:11
2005.12.18
Очистка контрола


6-1124823636
Korvet
2005-08-23 23:00
2005.12.18
Подключение к сети


5-1116931625
Rep
2005-05-24 14:47
2005.12.18
Получения фокуса наследником TCustomControl


2-1133272643
FShadow
2005-11-29 16:57
2005.12.18
Как обновить програмно данные в TDBGrid после изменения данныхю.