Помощь - Поиск - Пользователи - Календарь
Полная версия: Как взаимно использовать модули?
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
(:Irisha
Приветик! Не подскажете, как можно сделать, чтоб модули друг друга использовали? Они категорически отказываются!) Как вообще можно использовать эту возможность - чтоб uses было после implementation и все работало?) он выдает такие разнообразные ошибки компилляции.. lol.gif
И еще..Вот, допустим, в одном модуле описан объект, в другом - его потомок, у который часть методов переопределил. Как можно из него воспользоваться одноименным родительским методом? а еще желательнее - из родителя - методом потомка..
Наверно - вообще низзя? mega_chok.gif
volvo
Цитата
Как вообще можно использовать эту возможность - чтоб 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;


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

FAQ: ООП -> Виртуальные методы
мисс_граффити
Опытным путем установлено, что, если у P нет параметров, можно писать не
 Inherited P;

а просто
Inherited

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

Кстати, в TP это не проходит. Он в любом случае требует название метода...
мисс_граффити
не между тем разница smile.gif
в смысле, если он у нас без параметров и
1. вызываем через inherited с указанием имени
2. вызываем без указания

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

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.
мисс_граффити
я не забыла... я не знала smile.gif
классно.
у меня на защите лабораторки задача подобная была....

а если b тоже заместить - будет работать?
volvo
А какая разница замещен он или нет? Ты ж обращаешься к предку, и замещены его методы или нет он не знает...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.