можно использовать метод класса, который проверит есть ли экземпляры с такими свойствами...
То, что выделено красным - несовместимо...
Понимаешь, в чем дело... В Class Method-е ты не можешь обращаться к данным класса/НЕ-классовым методам/свойствам... По одной простой причине: в момент, когда ты вызываешь Class Method у тебя может не быть ни одного экземпляра класса. То есть, проверить что-либо, касаемое экземпляров именно этого класса у тебя не выйдет.
Вот еще один классический пример использования: НДС (ну, или любой другой налог), взимаемый за, скажем, услугу, описываемую типом T, изначально равен 17%... В какой-то момент этот налог увеличивается. При инициализации нового экземпляра класса мы должны увидеть новое значение налога, и при обработке информации, связанной с T (!!!), тоже будет рассматриваться новое значение. Что делаем?
{$mode ObjFPC} unit unit_1;
interface
type T = class constructor init();
class procedure set_VAT(vat_value: double); end;
implementation
var VAT: double = 0.17;
constructor T.init(); begin writeln('VAT = ', VAT:10:5); end;
class procedure T.set_VAT(vat_value: double); begin VAT := vat_value; end;
end.
Используем так:
uses unit_1;
var obj_1, obj_2: T;
begin obj_1 := T.init(); T.set_VAT(0.19); obj_2 := T.init(); ... end.
Я знаю, что ты скажешь: "А почему бы не просто функция (вообще вне класса), которая будет изменять переменную? Или вообще напрямую изменять переменную, безо всяких функций... Зачем навороты?" Так?
Не так... То, что напрямую - это нарушается принцип упрятывания информации, значит придется работать-таки через какой-то интерфейс. Простая функция? Да ни в коем случае... Я же сказал, что VAT - это налог за услугу T, а если будет 2 услуги? T и R, например? Налог на T один, на R - другой... Почему не просто метод в классе T? Потому, что у меня может не быть ни одного экземпляра инициализировано, а придется менять VAT. Создавать временный экземпляр, а потом удалять его - глупо.
Поэтому делаем Class Procedure, и программа становится прозрачной... Даже если у меня уже и есть инициализированные экземпляры класса T, я предпочту сделать НЕ так:
obj_1.set_VAT(0.19);
, а вот так:
T.set_VAT(0.19);
, потому, что налог распространяется НЕ на один какой-то экземпляр услуги, а на весь ее тип !!!
Понимаешь, в чем вся идея? Ты пользуешься Class Method-ами тогда, когда тебе нужно сделать что-то, что характерно НЕ для экземпляра, а в целом для класса...