Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с областью видимости переменных 
V
    Опции темы
rodnover
Дата 29.8.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Код

unit Unit2;

interface

type
  TA = class
  protected
    function func: string; virtual;
  end;

implementation

function TA.func: string;
begin
  Result := 'Test';
end;

end.



Код

unit Unit3;

interface

uses
  Unit2;

type
  TB = class(TA)
  protected
    Owner: TA;
    function func: string; override;
  public
    constructor Create(Own: TA);
  end;

implementation

{ TB }

constructor TB.Create(Own: TA);
begin
  Self.Owner := Own;
end;

function TB.func: string;
begin
  Result := Owner.func + ', Test2';    // [DCC Error] Unit3.pas(28): E2362 Cannot access protected symbol TA.func
end;

end.



По идее, класс TB наследуется от TA, следовательно он должен иметь доступ к protected методам родителя. Почему в таком случае delphi запрещает это делать (и с чем это связан этот запрет) и как можно обойти это ограничение? 
PM MAIL   Вверх
Frees
Дата 29.8.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Код

Result := inherited func + ', Test2';



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
rodnover
Дата 29.8.2011, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Frees, не, не то. Мне именно поля Owner надо вызвать, а не Self. Я хочу декоратор сделать, но не хочу объявлять некоторые protected методы как public.

Это сообщение отредактировал(а) rodnover - 29.8.2011, 12:12
PM MAIL   Вверх
Snowy
Дата 29.8.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ты можешь обратиться к своей protected функции. но не к protected функции другого объекта, даже, если технически он ссылается на тебя.
PM MAIL   Вверх
rodnover
Дата 29.8.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Придется открывать. Плохо.
PM MAIL   Вверх
sCreator
Дата 29.8.2011, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

Репутация: 2
Всего: 5



Сделай маленький хак  smile 
Код

unit Unit3;

interface
uses
  Unit2;
type
  TAHack = class(TA);

  TB = class(TA)
  protected
    Owner: TA;
    function func: string; override;
  public
    constructor Create(Own: TA);
  end;
implementation
{ TB }
constructor TB.Create(Own: TA);
begin
  Self.Owner := Own;
end;
function TB.func: string;
begin
  Result := TAHack(Owner).func + ', Test2';    // [DCC Error] Unit3.pas(28): E2362 Cannot access protected symbol TA.func
end;

end.

PM   Вверх
superVad
Дата 29.8.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 4
Всего: 15



sCreator, 
Код

constructor TB.Create;
begin
  Self.Owner := TA.Create;
end;

?

Это сообщение отредактировал(а) superVad - 29.8.2011, 20:56
PM MAIL   Вверх
sCreator
Дата 29.8.2011, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

Репутация: 2
Всего: 5



Цитата(superVad @  29.8.2011,  18:54 Найти цитируемый пост)
?
ответ: ваша цитата не верна - у меня такого кода нет

PM   Вверх
rodnover
Дата 29.8.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



sCreator, завтра попробую. Крутой хак!! Идея отличная, конечно. Спасибо!
PM MAIL   Вверх
superVad
Дата 29.8.2011, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 4
Всего: 15



Цитата(sCreator @  29.8.2011,  17:08 Найти цитируемый пост)
ответ: ваша цитата не верна - у меня такого кода нет

удалил лишние теги smile

Я про то - может создавать объект родитель, а не передавать?
PM MAIL   Вверх
rodnover
Дата 30.8.2011, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Цитата(superVad @  30.8.2011,  00:57 Найти цитируемый пост)
Я про то - может создавать объект родитель, а не передавать?

Это всё равно не позволит в protected метод доступ получить.
PM MAIL   Вверх
Frees
Дата 30.8.2011, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(rodnover @  29.8.2011,  16:25 Найти цитируемый пост)
Придется открывать. Плохо.


Это значит ты гдето ошибся в проектировании классов.

и это тоже признак ошибок проектирования
Цитата(sCreator @  29.8.2011,  20:17 Найти цитируемый пост)
TAHack(Owner).func



Это сообщение отредактировал(а) Frees - 30.8.2011, 07:48


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
rodnover
Дата 30.8.2011, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



А как тогда сделать в Делфи 2 дружественных класса не помещая их в одном модуле?
PM MAIL   Вверх
Frees
Дата 30.8.2011, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(rodnover @  30.8.2011,  11:38 Найти цитируемый пост)
А как тогда сделать в Делфи 2 дружественных класса не помещая их в одном модуле?

спроектировать по другому, что бы такого желания не возникало - единственно правильный способ


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
rodnover
Дата 30.8.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Соглашусь на половину (чуть больше половины). Чем мне нравятся дружественные классы в С++, что класс сам определяет какие классы будут ему дружественными, в отличии от хака предложенного выше.
Это верный но способ, не не факт, что единственно правильный. ;) Всё-таки иногда считаю, что группа классов должна работать как единое целое (с точки зрения экономии строчек кода и повышения производительности).

Это сообщение отредактировал(а) rodnover - 30.8.2011, 12:44
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1062 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.