Доступ к приватным полям из 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исправил это для меня!:) так что если вы столкнетесь с этими проблемами.. попробуйте сами..

Другие вопросы по тегам