Доступ к приватным полям из Class Helper
Дано
type
TMyClass = class
private
FPrivateInt : Integer;
protected
FProtectedInt : Integer;
public
FPublicInt : Integer;
end;
в одном блоке и
type
TMyHelper = class helper for TMyClass
function Sum : Integer;
end;
[...]
function TMyHelper.Sum: Integer;
begin
Result := 0;
Result := Result + FPublicInt;
Result := Result + FProtectedInt;
Result := Result + FPrivateInt; // <- compiler error here
end;
в другом компилятор XE8 сообщает об ошибке "необъявленный идентификатор E2003 'FPrivateInt'. Это то, чего я бы интуитивно ожидал, учитывая ограниченную видимость закрытых членов вне модуля, где объявлен класс, если бы я не видел пример на p89/90 Marco Cantu Delphi 2007 Справочник помощника класса, который обращается к частным полям класса "помог", а также однозначное утверждение во вступительном абзаце принятого ответа на этот вопрос
Могу ли я вызвать статический метод закрытого класса с помощью помощника класса?
который, кажется, поддерживает это: "Как широко известно, помощники взламывают частную видимость. Итак, частные члены видны из помощника класса. ..."
Итак, почему я получаю ошибку E2003 Undeclared Identifier? Я явно что-то упускаю где-то, в моем понимании или коде. Я получаю ту же ошибку, используя XE4, а XE6, кстати, и XE4, предшествует ответу SO, на который я ссылался, - от прошлого года.
1 ответ
Изложенное ниже решение работает для версий вплоть до Delphi Seattle.
По неизвестным мне причинам, вы должны квалифицировать членов частного экземпляра с Self
, Итак, это компилирует:
function TMyHelper.Sum: Integer;
begin
Result := 0;
Result := Result + FPublicInt;
Result := Result + FProtectedInt;
Result := Result + Self.FPrivateInt;
end;
Вопреки предложениям в комментариях, то же самое относится и к методам. Вы должны были бы явно включить Self.
вызвать приватный метод в хелпе.
В Delphi 10.1 Berlin и за его пределами больше нет доступа strict private
или же private
Члены вертолета в помощнике.
Для пользователей, которые используют Delphi 10.2/10.3 - я нашел здесь статью: Как получить доступ к частному полю из помощника класса в Delphi 10.1 Berlin?
Где сказано, что использование with Self do
позволяет получить доступ к частным переменным из помощника класса! У меня было несколько вспомогательных классов, которые использовали self.variable, и они выдавали ошибку, из-за которой мне не разрешен доступ к частной области.
В with Self do
исправил это для меня!:) так что если вы столкнетесь с этими проблемами.. попробуйте сами..