тут я разобрался, но у меня возникают проблемы при размещении обьекта в модуле берем программу volvo приабразовываем в модуль(прикрепленный файл) и аналогичном тесте получаю Error:
Потому, что у тебя программа не знает о переопределении в модуле оператора присваивания, ей надо об этом сообщить... Добавь в модуле перед Implementation описания:
А можна где нибудь посмотреть пример вызова метода другого обьекта(который описан в другом модуле) из метода другого обьекта(который также реализован в отдельном модуле)?
заранее благодарен.
Добавлено через 3 мин. у меня возникает Class isn’t a parent class of the current class
Ты пытаешься вызвать процедуру через тип объекта, а для этого надо static метод... В FPC нереализуемо, если у тебя o1 является Object-ом, а не Class-ом... С Class-ом будет так:
{$mode objfpc}
unit e1; interface
type o1 = class class procedure p(); end;
implementation
procedure o1.p(); begin end;
end.
, тогда
procedure o2.pr(); begin o1.p(); // здесь - Ok end;
Ну, а на самом деле я думаю, что тебе надо бы объявить экземпляр объекта типа o1, и вызывать для него метод P:
var ex1: o1; procedure o2.pr(); begin ex1.p(); end;
Ты пытаешься вызвать процедуру через тип объекта, а для этого надо static метод...
тоесть если я сделаю все static оно может заработает но не на FPC
Цитата(volvo @ 8.07.2007 21:19)
В FPC нереализуемо, если у тебя o1 является Object-ом, а не Class-ом...
ух єти классы.. где про них можна прочитать(руководство смотрел только больше запутался и вообще потерял способность различать обьекты и классы оф. сайт FP, моя тема...)
Цитата(volvo @ 8.07.2007 21:19)
Ну, а на самом деле я думаю, что тебе надо бы объявить экземпляр объекта типа o1, и вызывать для него метод P:
в том же и дело что это только модули подключаемые к программе...
ЗЫ попробую через классы... ЗЗЫ хотелось бы услышать твое обьяснение о различии обьектов и классов...
Contrary to objects, all data fields of a class are always stored in heap memory.
Дальше - из ref.pdf: 2)
Цитата
6.3.2 Virtual methods Classes have virtual methods, just as objects do. There is however a difference between the two. For objects, it is sufficient to redeclare the same method in a descendent object with the keyword virtual to override it. For classes, the situation is different: virtual methods must be overridden with the override keyword. Failing to do so, will start a new batch of virtual methods, hiding the previous one.
3) Добавлены message methods для классов ... 4) Уровень доступа published
+ еще одно отличие: operators overloading прекрасно работает с Object-ами, но с Class-сами происходят очень непонятные вещи...
Цитата(compiler)
в том же и дело что это только модули подключаемые к программе...
Ну и что, что только модули? Если модуль, так можно бессмысленно писать что-то? Что ты думаешь будет делаться в этом фрагменте:
o1.p();
? Особенно, если ни один экземпляр класса (или объекта) еще не инстанцирован?
а можна тут по подробней, а то я не могу понять...
Цитата(volvo @ 9.07.2007 13:28)
+ еще одно отличие: operators overloading прекрасно работает с Object-ами, но с Class-сами происходят очень непонятные вещи...
спасибо за предупреждение
Цитата(volvo @ 9.07.2007 13:28)
Что ты думаешь будет делаться в этом фрагменте:
o1.p();
?
если мы его немног видоизменим, то ничего страшного...
{$mode objfpc} {$STATIC ON} unit e1; interface type o1 = class i:integer; static;//кто придумал задавать параметр через разделитель? class procedure p();
end; implementation procedure o1.p(); begin inc(self.i); end; end.
6.2. Class instantiation Remember that a class is a pointer to an object, so when a variable of some class is declared, the compiler just allocates a pointer, not the entire object.
Следовательно, в модуле меняешь в определении типа T слово Object на Class, а программу переписываешь так:
uses _u;
var my_obj: T;
begin my_obj := T.create(17); writeln(my_obj.value); my_obj.destroy(); end.