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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив в виде скрытого поля в классе, Как получить ссылку на него? 
:(
    Опции темы
Traum
Дата 19.8.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Одно из преимуществ объектно-ориентированного программирования - скрытность полей, невозможность модифицировать их некорректным образом. Ниже я сделал объект для массива вещественных чисел со "всеми" удобствами подобно TStrings. Но возникает следующая проблема: мне иногда нужно получить ссылку на массив например при использовании MaxValue(arr : array of double), имеющуюся в Math модуле, а также во многих других случаях. Как это сделать? Через property? И как на счет того, что получив ссылку на этот массив я могу его случайно изменить (например изменить его размер) и тогда скрытность полей окажется фиктивной?

Код

Type TArr = class(TObject)

  private

    fVals       :  array of double
    fSize       :  integer ;
    fName       :  string  ;
    fTag        :  string  ;

    function GetVal(i: integer): double;
    procedure SetVal(i: integer; const Value: double);

  public

    constructor Create;
    destructor Destroy; override;

    procedure AddVal(Val:double);
    procedure DelVal(i:integer);
    procedure Clear;

    property Name             : string  read fName  write fName;
    property Tag              : string  read fTag   write fTag ;
    property Val[i:integer]   : double  read GetVal write SetVal;
    property Size             : integer read fSize;

end;


Это сообщение отредактировал(а) Traum - 19.8.2007, 10:21
PM MAIL   Вверх
Демо
Дата 19.8.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Стандартным приемом.

Код


Type 
TArrayDouble = array of double;

TArr = class(TObject)

  private

    fVals       :  TArrayDouble;
    fSize       :  integer ;
    fName       :  string  ;
    fTag        :  string  ;

    function GetVal(i: integer): double;
    procedure SetVal(i: integer; const Value: double);

  public

    constructor Create;
    destructor Destroy; override;

    procedure AddVal(Val:double);
    procedure DelVal(i:integer);
    procedure Clear;

    property Name             : string  read fName  write fName;
    property Tag              : string  read fTag   write fTag ;
    property Val[i:integer]   : double  read GetVal write SetVal;
    property Size             : integer read fSize;
    property arr: TArrayDouble read fVals;

end;



--------------------
    
PM MAIL ICQ Skype   Вверх
MetalFan
Дата 19.8.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Traum @  19.8.2007,  10:14 Найти цитируемый пост)
Но возникает следующая проблема: мне иногда нужно получить ссылку на массив например при использовании MaxValue(arr : array of double), имеющуюся в Math модуле

Так сделай метод в классе maxValue, который будет сам работать с приватным полем


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
pseud
Дата 20.8.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



MetalFan,
поддерживаю

Код

public
  function MaxVal: double

...
implementation
...

function TArr.MaxVal: double
begin
  Result := MaxValue(Self);
end;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
MetalFan
Дата 20.8.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



только не
Цитата(pseud @  20.8.2007,  10:03 Найти цитируемый пост)
Result := MaxValue(Self);

а
Код

Result := MaxValue(fVals); 
      


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 20.8.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Цитата

Так сделай метод в классе maxValue, который будет сам работать с приватным полем 


Ну каждую функцию дублировать не будешь же... Правильнее, как показал Демо. Кстати, в VCL, такое тоже используется. Например TList.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 20.8.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(aktuba @  20.8.2007,  12:39 Найти цитируемый пост)
Ну каждую функцию дублировать не будешь же...

зачем каждую? только необходимые!
согласись, удобнее и понятнее писать так:
Код

  ListBox.AddItem( 'Item', SomeObject );

чем
Код

  ListBox.Items.AddObject( 'Item', SomeObject );

на то оно и ООП, чтобы объект инкапсулировал в себе другие объекты и данные и предоставлял методы для доступа к внутренним данным...
а если объект будет "наружу" отдавать все свои данные для внешней обработки, то на кой он нужен тогда?

Это сообщение отредактировал(а) MetalFan - 20.8.2007, 16:22


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 20.8.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Цитата

согласись, удобнее и понятнее писать так


Удобнее, но иногда все-таки нужен выход наружу...

Цитата

на то оно и ООП, чтобы объект инкапсулировал в себе другие объекты и данные и предоставлял методы для доступа к внутренним данным...


А еще есть делегирование и много других умных слов  smile Если серьезно, то ООП не только для инкапсуляции.

Цитата

а если объект будет "наружу" отдавать все свои данные для внешней обработки, то на кой он нужен тогда?


Цитата

зачем каждую? только необходимые!


 smile 


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Traum
Дата 30.8.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Демо @ 19.8.2007,  10:38)
Стандартным приемом...

...
    property arr: TArrayDouble read fVals;

Чем это по сути отличается от того, если бы я просто расположил переменную fVals :  TArrayDouble в разряд public?
PM MAIL   Вверх
aktuba
Дата 30.8.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Цитата

Чем это по сути отличается от того, если бы я просто расположил переменную fVals :  TArrayDouble в разряд public? 


Тем, что если ты расположишь переменную в public, то ее можно будет изменять, а если сделать проперти - то, в данном случае, нет.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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