Нулевой вектор уже нормализован, при любом определении нормы вектора, с которым я когда-либо сталкивался, так что это один случай, который рассматривается.
Что касается вектора с компонентами, сумма которых равна нулю - это зависит от того, какое определение нормы вы используете. С простой старой L2-нормой (евклидовым расстоянием между началом и вектором) стандартная формула для вычисления нормализованного вектора должна работать нормально, поскольку она сначала возводит в квадрат отдельные компоненты.
Как описано в справке Delphi, помощники классов не предназначены для общего использования, и они неправильно воспринимаются как имеющие ряд ограничений или даже в результате ошибок.
тем не менее, есть представление - неправильное и опасное, на мой взгляд, - что это законный инструмент в «инструментарии» общего назначения. Я писал в блоге , почему это неправильно , а затем о том, как можно каким-то образом снизить опасность, следуя социально ответственному шаблону кодирования (хотя даже это не пуленепробиваемое) .
Вы можете добиться значительного эффекта помощника класса без каких-либо этих ошибок или ограничений или (что наиболее важно) рисков , используя жесткое приведение к «псевдо» класс, производный от класса, который вы пытаетесь расширить. т.е. вместо:
TFooHelper = class helper for TFoo
procedure MyHelperMethod;
end;
использовать
TFooHelper = class(TFoo)
procedure MyHelperMethod;
end;
Как и в случае с «формальным» помощником, вы никогда не создаете экземпляр этого класса TFooHelper , вы используете его исключительно для изменения класса TFoo , за исключением в этом случае вы должны быть точными. В вашем коде, когда вам нужно использовать некоторый экземпляр TFoo с помощью ваших «вспомогательных» методов, вам необходимо жестко привести его:
TFooHelper(someFoo).MyHelperMethod;
Недостатки:
вы должны придерживаться тех же правил, которые применяются помощникам - нет данных о членах и т. д. (на самом деле это не недостаток, за исключением того, что компилятор не будет «напоминать вам»).
Насколько я могу судить, нет никакого способа поместить помощник класса в общий класс и заставить его скомпилировать. Вы должны сообщить об этом QC как об ошибке.