Здравствуйте, 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>
Прямое нарушение инкапсуляции