С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
4 / 4 / 5
Регистрация: 01.03.2013
Сообщений: 180
1

Передача объекта из одного экземпляра класса в другой с запретом обращаться к методам и свойствам этого объекта

05.02.2019, 09:10. Показов 2822. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Есть класс, в котором используется объект (MyObject, объявленный в private).
При создании второго экземпляра этого класса нужно передать из первого этот объект. Причем так, чтобы нельзя было изменить никакое свойство этого объекта (вне класса) и нельзя было вызвать его методы.
Создал в классе свойство на чтение
Delphi
1
property ObjectReadOnly:TMyObject read MyObject;
Но при обращении к этому свойству (извне) могу обращаться к его членам без проблем, чего мне не нужно (класс общего пользования, поэтому не хотелось бы, чтобы он перестал работать, если кто-нибудь сделает MyClass.ObjectReadOnly.Free, например)
Возможно ли сделать это в Delphi?

Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2019, 09:10
Ответы с готовыми решениями:

Не работает передача объекта из одного класса в другой через return
Есть 2 объекта класс Reading ,text и line,которые посредством методов std::string outstr()...

Получение доступа к свойствам программно созданного объекта массива из эвента этого же объекта
У меня программно создается массив кнопок, и надо каждой присвоить эвент при нажатии на нее. Как...

Передача имени класса и создание экземпляра соответствующего объекта
Добрый день! В моем приложении часто используется код: if (!Dialogs.connectedToDB())...

Как обращаться к свойствам объекта?
Мне нужно изменить Height в Charapter Controller,как мне обратится к Height через скрипты?

5
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
05.02.2019, 09:34 2
Ну, свойство с геттером тут точно не поможет. В нем хранится только указатель не объект. Далее, защищаться от удаления этого объекта вы будете от себя или от сторонних пользователей вашего класса? Если от себя, то тут надо лучше простроить алгоритм, чтобы избежать этих ситуаций. Если от других, то все просто. Объявляем деструктор объекта и проверяем:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TMyObject = class(TObject)
 private
  FReadOnly:Boolean;
 protected
 public
  destructor Destroy;override;
end;
 
...
 
procedure TMyObject.Destroy;
begin
if not FReadOnly then
 inherited;
end;
Имхо, должно сработать.
1
4 / 4 / 5
Регистрация: 01.03.2013
Сообщений: 180
05.02.2019, 09:47  [ТС] 3
Цитата Сообщение от Nanotentacle Посмотреть сообщение
свойство с геттером тут точно не поможет
не поможет, чтобы запретить использовать члены объекта или передать его в другой экземпляр этого класса?
Сама передача хорошо работает, но вот только смутило то, что объект этот извне могу использовать хоть как.

Цитата Сообщение от Nanotentacle Посмотреть сообщение
защищаться от удаления этого объекта вы будете от себя или от сторонних пользователей вашего класса?
От себя вряд-ли, ведь я знаю, что этот объект трогать нельзя, только передать его в другой экземпляр.
С другой стороны, сейчас помню, потом забыл.
Также, будут другие пользователи класса, которые могут что нибудь натворить с объектом.
За идею и код - спасибо, но Free - не единственный метод объекта. Неужели придется оверрайдить каждый метод?
0
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,393
Записей в блоге: 20
05.02.2019, 09:55 4
Лучший ответ Сообщение было отмечено Sanches как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TSecretClass=class
end;
 
TMyclass=class
private
  Fsc:TSecretClass;
public
  constructor Clone(const ASrc:TMyClass);
end;
 
constructor TMyclass.Clone(const ASrc:TMyClass);
begin
  inherited Create;
  Fsc := ASrc.Fsc;
end;
Добавлено через 1 минуту
а есть еще
CLASS VAR
если вам нужна переменная общая для всех объектов этого класса
1
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
05.02.2019, 10:09 5
Цитата Сообщение от Sanches Посмотреть сообщение
Сама передача хорошо работает, но вот только смутило то, что объект этот извне могу использовать хоть как.
Чтобы его нельзя было использовать извне его не должно быть ни в каком виде в секции public. Соответственно, отсюда вывод: надо делать для класса-обертки свои методы, которые будут вызывать методы вложенного класса. Тогда все будет штатно и с проверкой.

Цитата Сообщение от Sanches Посмотреть сообщение
не поможет, чтобы запретить использовать члены объекта или передать его в другой экземпляр этого класса?
Ни для чего. Защитит только от прямого присвоения (читай, замещения ссылки) другого экземпляра класса.

Цитата Сообщение от Sanches Посмотреть сообщение
С другой стороны, сейчас помню, потом забыл
Имхо, надо по умолчанию считать, что жизненный цикл внутренних объектов объекта-обертки должен обрабатываться объектом-оберткой и никем другим, если нет уверенности в ином.
1
4 / 4 / 5
Регистрация: 01.03.2013
Сообщений: 180
05.02.2019, 10:19  [ТС] 6
Цитата Сообщение от krapotkin Посмотреть сообщение
Delphi-код ...
Тоже думал об этом. Спасибо!
0
05.02.2019, 10:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2019, 10:19
Помогаю со студенческими работами здесь

Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два
Здравствуйте. Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию...

Передача методу одного объекта ссылки на другой объект
Здравствуйте, совсем недавно начал изучать объектный php и возник следующий вопрос. $c = new...

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

Передача объекта однго класса в другой класс
Имеется класс Main в котором имеется класс PortReader с обработчиком события serialEvent по приему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru