А существует универсальная функция сравнения объектов?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

А существует универсальная функция сравнения объектов?

Сообщение leo_bsv » 08.01.2012 02:34:12

Возможно есть такая гибкая функция которая сравнивает объекты класса :?:
При этом хавает разные классы и сравнивает объекты по свойствам класса (естественно сравниваемые объекты одного класса!) :?:
Но сами свойства в ней не прописываются а функция магическим образом о них узнаёт и перебирает например в цикле :?:
Или я губу раскатал :?: :D
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: А существует универсальная функция сравнения объектов?

Сообщение Brainenjii » 08.01.2012 09:40:51

Я для подобной задачи написал свой теплый ламповый кодогенератор ^_^ Ещё чуть-чуть и можно его в открытый доступ выкладывать
А так, можно посмотреть в сторону RTTI (хотя лично я не захотел с этим связываться)
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: А существует универсальная функция сравнения объектов?

Сообщение Odyssey » 08.01.2012 12:28:58

Если не ошибаюсь, RTTI работает только с published-свойствами. Поэтому для такого сравнения действительно можно использовать только кодогенератор.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: А существует универсальная функция сравнения объектов?

Сообщение NTFS » 08.01.2012 13:47:35

Стоит посмотреть в сторону смены инструмента, раз возникают такие задачи. Например, в .NET есть Reflections. ИМХО, Паскаль для такого не предназначен в принципе - он прежде всего для обучения и быстрой разработки приложений.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: А существует универсальная функция сравнения объектов?

Сообщение iskander » 08.01.2012 18:59:37

TObject.Equals(Obj: TObject) : boolean, например. :)
Функция виртуальная, переопределяй и сравнивай как хочешь.
2 NTFS
Паскаль для такого не предназначен в принципе - он прежде всего для обучения и быстрой разработки приложений.

и всё ? :)
Последний раз редактировалось iskander 08.01.2012 22:10:28, всего редактировалось 1 раз.
iskander
энтузиаст
 
Сообщения: 623
Зарегистрирован: 08.01.2012 18:43:34

Re: А существует универсальная функция сравнения объектов?

Сообщение NTFS » 08.01.2012 19:35:02

iskander

Чаще всего да. Мне как-то странно представить, чтобы Паскаль массово применяли для разработки веб-приложений или драйверов устройств. Я, правда, делал и то, и другое - но это уже из разряда: "Месье знает толк в извращениях!" :-)
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: А существует универсальная функция сравнения объектов?

Сообщение iskander » 08.01.2012 20:23:08

NTFS
...а почему Джо неуловимый ???
да вот, не ловит никто...
:)
iskander
энтузиаст
 
Сообщения: 623
Зарегистрирован: 08.01.2012 18:43:34

Re: А существует универсальная функция сравнения объектов?

Сообщение leo_bsv » 09.01.2012 02:29:45

iskander писал(а):Функция виртуальная, переопределяй и сравнивай как хочешь.

ну так тож опять для каждого класса все свойста в ней перебирать при сравнении?... хотелось именно это объехать... :D
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: А существует универсальная функция сравнения объектов?

Сообщение alexs » 09.01.2012 12:02:12

А вчём физический смысл сравнения разнродных объектов?
Пример можно?
Я понимаю - когда экземпляры одного класса. А вот когда и классы разные. Бегемотов с вертолётом сравнивать...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: А существует универсальная функция сравнения объектов?

Сообщение leo_bsv » 09.01.2012 15:22:34

alexs писал(а):Бегемотов с вертолётом сравнивать...

я НЕ имел ввиду это
Код: Выделить всё
Compare(x:TMyPants;y:TMySocks):boolean

я имел ввиду вот это
Код: Выделить всё
Compare(x,y:[TMySocks or TMyPants or TMySomethingElse]):boolean

понятно да... одна функция обрабатывает много/все классы, но в одной операции участвует один класс, но несколько его объектов.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: А существует универсальная функция сравнения объектов?

Сообщение alexs » 09.01.2012 18:17:00

Либо наследование от общего класса с описанием функционала сравнения, либо перегрузка функции сравнения.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: А существует универсальная функция сравнения объектов?

Сообщение leo_bsv » 09.01.2012 18:59:35

alexs писал(а):наследование от общего класса с описанием функционала сравнения

для меня недалёкого оказалось новостью :shock:
alexs писал(а):перегрузка функции сравнения

нет - не новость... :?
спасибо!

Добавлено спустя 2 минуты 54 секунды:
alexs писал(а):наследование от общего класса с описанием функционала сравнения

в этом случае возможно сравнивать свойства классов-потомков в методе родителя?
мб пример? как в этой функции перебрать свойства любого класса-потомка?
опять же чтобы сделать метод достаточно универсальным, а не возвращаться к писанине для каждого класса, как это было бы с перегружаемой функцией...
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: А существует универсальная функция сравнения объектов?

Сообщение alexs » 09.01.2012 19:34:44

iskander писал(а):TObject.Equals(Obj: TObject) : boolean, например. :)

Человек правильно выше написал...
В родителе опиши максимально все общие поля, в функции сравнения опиши правила по существующим.
А в потомок уже по мере добавления новых полей добавляй в перкрываемой функции только сравнение новых полей.
Посмотри методы Assign и AssignTo у TPersistent и его наследников.
Как я понял - тебе надо аналогичное...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: А существует универсальная функция сравнения объектов?

Сообщение leo_bsv » 09.01.2012 19:59:34

alexs писал(а):Посмотри методы Assign и AssignTo у TPersistent и его наследников.

да, правильно понял. tnx!
Код: Выделить всё
  If Source is TCollection then

то что я хотел узнать.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: А существует универсальная функция сравнения объектов?

Сообщение alexey38 » 09.01.2012 20:03:04

Берем пример класса, в нем есть переменные класса. Некоторые переменные имеют типы чисел (integer, double). С ними понятно, как выполнять сравнение.
А если у Вас есть переменная типа указатель (на класс или на буфер данных). Как выполнять сравнение? Сравнивать адреса или сравнивать содержимое по ссылке?
Или например, переменная типа строка, она же тоже есть указатель. Идентичность - это одинаковый адрес строки или одинаковое значение строки?
Вот такие примеры как раз и говорят, что алгоритм сравнения приходиться писать индивидуально для каждого класса.

Я в одном из своих проектов, правда не для целей сравнения, а для целей сохранения в xml, сделал в базовом классе несколько переменных и функций примерно следующего содержания:
Код: Выделить всё
      DIB_TypeParams:Array of integer;//0 - Double
      DIB_Params:Array of Pointer;
      Procedure DIB_AddParam(Var par_Param:integer);overload;
...
Procedure TMyClass.AfterConstruction;
...
     DIB_AddParam(NodeNum);
...

Дальше базовый класс у меня уже знает, какие поля у меня есть, и я для них уже пишу функционал типа сохранения, загрузки, сравнения, редактирования и т.п.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 222

Рейтинг@Mail.ru