Re[9]: поясните плиз глубокий смысл
От: hattab  
Дата: 27.08.11 21:50
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB> H>По моему, достаточно просто понимать, что обычной переменной (полем) владеет конкретный объект, в то время, как переменной класса владеет класс и потомки.


OAB> ну вот я и не понимаю, почему это называется переменной класса! ведь если проводить вашу же паралель, то в первом случае (с объектом) для каждого объекта будет своя переменная, а во втором случае одна переменная для всех классов.


Поля объекта отражают состояние только конкретного объекта, в то время, как переменные класса отражает состояние класса вцелом. Причем говоря о классе, мы не может не подразумевать и его потомков т.к. даже самый нижний потомок является представителем верхнего класса-предка. Я к тому веду, что изменив поле объекта мы изменяем лишь сам объект, а изменив переменную класса мы мы оказываем влияние на класс вцелом.

Пример из жизни. Есть класс, объекты которого могут иметь весьма и весьма большое внутреннее состояние (от байтов, до нескольких гигабайт). Память не резиновая, поэтому в базовом классе предусмотрен механизм ограничения использования памяти. Класс имеет свойство класса (через переменную класса разумеется) TotalMemoryLimit и свойство MemoryLimit. Свойство MemoryLimit указывает, какое количество памяти может использовать объект для хранения своего внутреннего состояния. Свойство TotalMemoryLimit указывает какое количество памяти может быть использовано всеми объектами данного класса и его потомков. Весь функционал контроля лимитов выполнен в базовом классе, потому потомки этого класса реализуют только процесс переноса состояния из памяти в некое новое хранилище (файл, БД и т.п.) и обеспечивают последующий прозрачный доступ к нему. То есть, имея в базовом классе свойство TotalMemoryLimit, в виде переменной класса, мы можем управлять лимитом для всех его потомков. В случае, когда переменная была бы индивидуальной для каждого класса потомка, задача изменения лимита была бы крайне затруднительной (если не сказать невозможной), и профита от задействования полиморфизма (классы потомки реализующие различные хранилища) мы бы не получили.

OAB> по сути глобальная. уже б так и писали бы:

OAB>
OAB> var
OAB>   global_var: integer;

OAB> type
OAB>   ta = class
OAB>     class property fictive_class_var: integer read global_var write global_var;
OAB>   end;
OAB>


Прямое нарушение инкапсуляции
avalon 1.0rc3 rev 419, zlib 1.2.3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.