Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Как взаимно использовать модули?

Автор: (:Irisha 23.10.2006 17:05

Приветик! Не подскажете, как можно сделать, чтоб модули друг друга использовали? Они категорически отказываются!) Как вообще можно использовать эту возможность - чтоб uses было после implementation и все работало?) он выдает такие разнообразные ошибки компилляции.. lol.gif
И еще..Вот, допустим, в одном модуле описан объект, в другом - его потомок, у который часть методов переопределил. Как можно из него воспользоваться одноименным родительским методом? а еще желательнее - из родителя - методом потомка..
Наверно - вообще низзя? mega_chok.gif

Автор: volvo 23.10.2006 17:29

Цитата
Как вообще можно использовать эту возможность - чтоб uses было после implementation и все работало?)
Если Uses - после Implementation - то все работает... Если же ты два модуля присоединиши друг к другу в Interface - то будет Circullar Unit Reference (я даже объяснял, почему это происходит...)

Поскольку ты не сказала, какие именно "разнообразные" ошибки тебе выдает компилятор, то все, что могу сделать - сказать, что вот ЭТО:

Unit P1;
interface

implementation
uses P2;

end.


Unit P2;
interface

implementation
uses P1;

end.
будет прекрасно компилироваться... Хотя модули тоже циклически вызывают друг друга...

Цитата
допустим, в одном модуле описан объект, в другом - его потомок, у который часть методов переопределил. Как можно из него воспользоваться одноименным родительским методом?
Опять же, смотря как переопределил... Но из метода потомка всегда можно попробовать вызвать метод родителя:
Type 
TA = object
procedure P;
end;

Type
TB = object
procedure P;
end;

procedure TB.P;
begin
Inherited P; { <--- Вызов метода родителя }
end;


Цитата
а еще желательнее - из родителя - методом потомка..

http://forum.pascal.net.ru/index.php?s=&showtopic=2085&view=findpost&p=17920

Автор: мисс_граффити 23.10.2006 18:16

Опытным путем установлено, что, если у P нет параметров, можно писать не

 Inherited P;

а просто
Inherited

в чем разница - не знаю.

Автор: (:Irisha 23.10.2006 18:34

Спасибочки, и правда работает) Я просто пыталась сделать ему малость ненужную вещь, надо ее по-другому реализовать. Начал говорить, например, что ошибка 70- что-то там изменилось.. И ведь прально делал..
Inherited - точно! blush.gif не зря, не зря было такое слово в чужой лекции))) пасиб !yessir.gif

Автор: volvo 23.10.2006 20:15

Цитата
в чем разница - не знаю.
smile.gif В том, что если нет параметров, то компилятор вполне способен подставить имя метода самостоятельно, чего не сможет сделать с параметрами...

Кстати, в TP это не проходит. Он в любом случае требует название метода...

Автор: мисс_граффити 23.10.2006 20:39

не между тем разница smile.gif
в смысле, если он у нас без параметров и
1. вызываем через inherited с указанием имени
2. вызываем без указания

зачем-то же реализована возможность делать и так, и так?
или ситуация примерно такая же, как с функциями с параметрами по умолчанию - можно писать, можно не писать...?

Автор: volvo 23.10.2006 20:47

Цитата
ситуация примерно такая же, как с функциями с параметрами по умолчанию - можно писать, можно не писать...?
Если НЕ писать, то вызовется одноименный метод предка... Не забывай, ты можешь сделать и так:

type
ta = object
procedure a;
procedure b;
end;

tb = object(ta)
procedure a;
end;

procedure ta.a;
begin
writeln('a.a');
end;
procedure ta.b;
begin
writeln('a.b');
end;

procedure tb.a;
begin
inherited b;
inherited;
writeln('b.a');
end;

var X: tb;
begin
X.a;
end.

Автор: мисс_граффити 23.10.2006 20:56

я не забыла... я не знала smile.gif
классно.
у меня на защите лабораторки задача подобная была....

а если b тоже заместить - будет работать?

Автор: volvo 23.10.2006 21:08

А какая разница замещен он или нет? Ты ж обращаешься к предку, и замещены его методы или нет он не знает...