:: MVP ::
|
|
:: RSS ::
|
|
|
Предисловие.
Есть такой раздел среди программистов C++, называется «Непонятный Си». В него входят программы, которые работают правильно,
но вот почему - неочевидно. Но вот среди программистов Delphi я такого раздела не встречал. Что ж, буду первым!
1. Как это работает.
При объявлении класса определяются все его поля и методы. Под поля выделяется место в момент создания экземпляра класса.
А методы помещаются в «фиксированное» адресное пространство. И когда экземпляры класса обращается к методу, то делается
переход по одному и тому же адресу в памяти. И это правильно, какой смысл создавать абсолютно одинаковые процедуры и функции
для каждого экземпляра класса!?
Если все понятно, развиваем тему. Когда компилятор, анализируя программный код, видит обращение к методу класс, он ставит переход
на конкретный адрес в памяти. И вот тут начинается самое интересное! При вызове метода не проверяется, был ли создан сам экземпляр
класса! И поэтому можно сделать так:
// 1.1. Определим класс
type
TMagicClass = class
public
procedure Show;
end;
// 1.2. Создадим метод
procedure TMagicClass.Show;
begin
ShowMessage('Упс.');
end;
// 1.3. Вызываем
TMagicClass(nil).Show;
|
Запускаем и удивляемся.
2. Как это НЕ работает.
Если внутри метода класса попытаться обратится к полям класса, тогда получаем исключение "Ошибка доступа", так как значение Self будет равно nil.
// 2.1. Определим класс
type
TMagicClass = class
public
Size: Integer;
procedure Show;
end;
// 2.2. Создадим метод
procedure TMagicClass.Show;
begin
ShowMessage(IntToStr(Size));
end;
// 3.3. Вызываем
TMagicClass(nil).Show;
|
3. Заключение.
Надеюсь, Вы узнали что-то новое и улыбнулись. Веселого Вам кододелания.
Автор: Thunderchild.
.: Пример к данной заметке :.
|
При использовании материала - ссылка на сайт обязательна
|
|