Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.15.99] |
|
Сообщ.
#1
,
|
|
|
Почему происходит исключение при вызове class procedure, если я вызываю её не через класс TSomeClass.ClassProc, а через объект var SomeObj: TSomeClass; ...; SomeObj.ClassProc, когда Obj = nil.
Разве такие методы не должны работать даже без создания объекта? |
Сообщ.
#2
,
|
|
|
Цитата Jin X @ Разве такие методы не должны работать даже без создания объекта? Классовые методы работают при любом вызове, но ес-но при условии, что в них нет явного или неявного обращения к экземпляру объекта (его полям, свойствам и неклассовым методам). В классовом методе Self является ссылкой на класс объекта (его VMT) , а не на сам объект. Из ссылки на объект всегда можно получить ссылку на его класс, а наоборот, разумеется, нельзя. PS: Если метод объекта не содержит ссылок на Self, то его можно вызвать через Obj = nil. Например, если в обработчике типа TForm1.FormKeyPress осуществляются манипуляции только с переданными параметрами Key и Sender без обращения к Self, то этот метод можно безопасно вызвать или присвоить событие другому объекту через TForm1(nil).FormKeyPress. Подобные фишки можно использовать для присвоения событий объектам без создания экземпляра объекта, которому принадлежат методы обработки событий. |
Сообщ.
#3
,
|
|
|
leo, так прикол в том, что исключение возникает даже тогда, когда в методе нет никакого обращения.
Т.е.: type TSomeClass = class class procedure ClassProc end; class procedure TSomeClass.ClassProc; begin end; var SomeObj: TSomeClass; begin SomeObj.ClassProc end. |
Сообщ.
#4
,
|
|
|
Цитата Jin X @ так прикол в том, что исключение возникает даже тогда, когда в методе нет никакого обращения 1.как уже сказано, self классового метода - указатель на vmt 2.компилятор пытается его получить читая скрытое поле объекта 3.объект не создан 4.в SomeObj мусор, либо nil 5. ? пиши так: type TSomeClass = class class procedure ClassProc; static; end; у такого метода скрытых параметров(self) нет |