Приветик! Не подскажете, как можно сделать, чтоб модули друг друга использовали? Они категорически отказываются!) Как вообще можно использовать эту возможность - чтоб uses было после implementation и все работало?) он выдает такие разнообразные ошибки компилляции.. И еще..Вот, допустим, в одном модуле описан объект, в другом - его потомок, у который часть методов переопределил. Как можно из него воспользоваться одноименным родительским методом? а еще желательнее - из родителя - методом потомка.. Наверно - вообще низзя?
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;
Цитата
а еще желательнее - из родителя - методом потомка..
Опытным путем установлено, что, если у P нет параметров, можно писать не
Inherited P;
а просто
Inherited
в чем разница - не знаю.
(:Irisha
23.10.2006 18:34
Спасибочки, и правда работает) Я просто пыталась сделать ему малость ненужную вещь, надо ее по-другому реализовать. Начал говорить, например, что ошибка 70- что-то там изменилось.. И ведь прально делал.. Inherited - точно! не зря, не зря было такое слово в чужой лекции))) пасиб
volvo
23.10.2006 20:15
Цитата
в чем разница - не знаю.
В том, что если нет параметров, то компилятор вполне способен подставить имя метода самостоятельно, чего не сможет сделать с параметрами...
Кстати, в TP это не проходит. Он в любом случае требует название метода...
мисс_граффити
23.10.2006 20:39
не между тем разница в смысле, если он у нас без параметров и 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
я не забыла... я не знала классно. у меня на защите лабораторки задача подобная была....
а если b тоже заместить - будет работать?
volvo
23.10.2006 21:08
А какая разница замещен он или нет? Ты ж обращаешься к предку, и замещены его методы или нет он не знает...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.