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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос о свойствах (property) 
V
    Опции темы
Ryn
Дата 6.9.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



у меня есть запись, она используется в классе:
Код

TTest = record
  fValue_1 : integer;
  fValue_2 : integer;
end;
...

CTest = class
  private
    fTest : TTest;
  public
    Property pTest : TTest Read fTest Write fTest;
end;


но при обращении к полям fValue_1 или fValue_2:

Код

...
var
  sTest : CTest;
begin
  sTest := CTest.Create;
  sTest.pTest.fValue_1 := 1;
  sTest.pTest.fValue_1 := 2;
end;


 делфи пишет - "Left side cannot be assigned to".

как это устранить ? только я не хочу писать функции присваивания в классе для этих полей.
PM MAIL   Вверх
Romikgy
Дата 6.9.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



а на кой те этот гемор? нельзя эту запись в publiс засунуть?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Romikgy @  6.9.2006,  15:09 Найти цитируемый пост)
нельзя эту запись в publiс засунуть? 

Не надо учить плохому! Это и есть реализация инкапсуляции - базового принципа ООП.

Ryn, Проидется писать через промежуточную переменную типа TTest

Это сообщение отредактировал(а) alexeis1 - 6.9.2006, 15:15


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 6.9.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(alexeis1 @  6.9.2006,  14:15 Найти цитируемый пост)
Не надо учить плохому!

а че здесь плохого ? зачем вообще придумали private?
Цитата(Ryn @  6.9.2006,  14:05 Найти цитируемый пост)
 private
    fTest : TTest;
  public
    Property pTest : TTest Read fTest Write fTest;

а здесь от него толку никакого, или я не прав?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 6.9.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Romikgy @  6.9.2006,  15:31 Найти цитируемый пост)
а здесь от него толку никакого, или я не прав? 

Пока что нет но в будущем такой класс легко наращивать или безопасно изменять. Просто вместо переменной будет указана функция которая помимо присваивания сделает может еще десяток операций, т.о. интерфес сохранится а функциональность возрастет. Так что модификации подвергнется только код класса, а не код всех проектов использующих этот класс.

Это сообщение отредактировал(а) alexeis1 - 6.9.2006, 15:38


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 6.9.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Код
var
  c: CTest;
  t: TTest;
begin
  c.pTest := t;
end;



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Snowy
Дата 6.9.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Romikgy, есть такая штука - инкапсуляция.
Сейчас ты поднимаешь вопрос о том, зачем она нужна...
Об этом расскажет любая книжка по ООП.

Теперь к вопросу. Почему.
Потому что запись не ссылочный тип и не может полноценно использоваться, как проперти.
Какой тут выход.
1. Использовать не запись, а объект.
Код

  TTest = class
  public
    fValue_1 : integer;
    fValue_2 : integer;
  end;

  CTest = class
    private
      fTest : TTest;
    public
      Property pTest : TTest Read fTest Write TTest;
      constructor Create;
      destructor Destroy; override;
  end;

implementation

constructor CTest.Create;
begin
  fTest := TTest.Create;
  fTest.fValue_1 := 0; fTest.fValue_2 := 0;
end;

destructor CTest.Destroy;
begin
  fTest.Free;
  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sTest : CTest;
begin
  sTest := CTest.Create;
  sTest.pTest.fValue_1 := 1;
  sTest.pTest.fValue_1 := 2;
end;


2. Использовать указатель на запись.
Код

  PTest = ^TTest;
  TTest = record
    fValue_1 : integer;
    fValue_2 : integer;
  end;

  CTest = class
    private
      fTest : PTest;
    public
      Property pTest : PTest Read fTest Write fTest;
      constructor Create;
      destructor Destroy; override;
  end;

implementation

constructor CTest.Create;
begin
  New(fTest);
  fTest.fValue_1 := 0; fTest.fValue_2 := 0;
end;

destructor CTest.Destroy;
begin
  Dispose(fTest);
  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sTest : CTest;
begin
  sTest := CTest.Create;
  sTest.pTest.fValue_1 := 1;
  sTest.pTest.fValue_1 := 2;
end;


Добавлено @ 15:46 
Ну, и как указал Yanis, в текущем состоянии запись можно назначать только целиком.
PM MAIL   Вверх
Ryn
Дата 6.9.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



понял, всем спасибо. буду как публис использовать, так проще вроде _)
PM MAIL   Вверх
Romikgy
Дата 6.9.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(alexeis1 @  6.9.2006,  14:37 Найти цитируемый пост)
Просто вместо переменной будет указана функция которая помимо присваивания сделает может еще десяток операций,

знаю , просто 
Цитата(Ryn @  6.9.2006,  14:05 Найти цитируемый пост)
только я не хочу писать функции присваивания в классе для этих полей. 


Цитата(Snowy @  6.9.2006,  14:44 Найти цитируемый пост)
есть такая штука - инкапсуляция.

знаю , только мало вижу смысл ее здесь применения (имено так как был описан класс!)
Цитата(Snowy @  6.9.2006,  14:44 Найти цитируемый пост)
Сейчас ты поднимаешь вопрос о том, зачем она нужна...

нет не поднимаю


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 6.9.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ryn @  6.9.2006,  15:49 Найти цитируемый пост)
буду как публис использовать, так проще вроде
Так конечно проще. Не самое грамотное решение, но кода меньше.

Цитата(Romikgy @  6.9.2006,  16:00 Найти цитируемый пост)
только мало вижу смысл ее здесь применения
Никогда не знаешь, когда понадобится.
Сейчас кажется - нафиг не нужно, а потом "блин, надо было".
Всё таки грамотный красивый стиль подразумевает инкапсулировать, а не выпячивать на публику.
PM MAIL   Вверх
Romikgy
Дата 6.9.2006, 16:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Еще раз повторюсь , 
Цитата(Snowy @  6.9.2006,  15:05 Найти цитируемый пост)
а не выпячивать на публику. 

я все говорил применительно к выставленому коду! 
ЗЫ ну объясни мне смысл прятать переменую в приват , если в паблике ты обращаешься к ней на прямую?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ryn
Дата 6.9.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Romikgy,
просто столкнулся с такой проблемой и решил спросить. ведь со стандартными типами и классами работает, а с записью нет.
PM MAIL   Вверх
Snowy
Дата 6.9.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Romikgy @  6.9.2006,  16:48 Найти цитируемый пост)
ну объясни мне смысл прятать переменую в приват , если в паблике ты обращаешься к ней на прямую?
В том и смысл, чтобы не было прямого обращения, а обращение шло через инкапсуляцию.
В идеале вообще не должно быть прямого доступа, а только инкапсуляция.
Но дельфи позволяет писать на разных уровнях.
Да можно и делать прямой доступ.
Просто так не принято в ООП.
Посмотри исходняки VCL и другиз стандартных классов.
Нигде нет прямого обращения - всё сделано через инкапсуляцию.
Я не заставляю, всего лишь указываю, что грамотно инкапсулировать.
PM MAIL   Вверх
Romikgy
Дата 6.9.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Snowy @  6.9.2006,  16:41 Найти цитируемый пост)
Просто так не принято в ООП.

дык я об этом и говорю!
Цитата(Snowy @  6.9.2006,  16:41 Найти цитируемый пост)
В идеале вообще не должно быть прямого доступа

и про это
Цитата(Snowy @  6.9.2006,  16:41 Найти цитируемый пост)
Я не заставляю, всего лишь указываю, что грамотно инкапсулировать.

должна быть не спорю, но имхо она должна быть еще и разумной!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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