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

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

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

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

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

Сообщение leo_bsv »

Возможно есть такая гибкая функция которая сравнивает объекты класса :?:
При этом хавает разные классы и сравнивает объекты по свойствам класса (естественно сравниваемые объекты одного класса!) :?:
Но сами свойства в ней не прописываются а функция магическим образом о них узнаёт и перебирает например в цикле :?:
Или я губу раскатал :?: :D
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Я для подобной задачи написал свой теплый ламповый кодогенератор ^_^ Ещё чуть-чуть и можно его в открытый доступ выкладывать
А так, можно посмотреть в сторону RTTI (хотя лично я не захотел с этим связываться)
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Если не ошибаюсь, RTTI работает только с published-свойствами. Поэтому для такого сравнения действительно можно использовать только кодогенератор.
NTFS
постоялец
Сообщения: 388
Зарегистрирован: 05.11.2007 13:57:50
Откуда: Краснодар
Контактная информация:

Сообщение NTFS »

Стоит посмотреть в сторону смены инструмента, раз возникают такие задачи. Например, в .NET есть Reflections. ИМХО, Паскаль для такого не предназначен в принципе - он прежде всего для обучения и быстрой разработки приложений.
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

и всё ? :)
Последний раз редактировалось iskander 08.01.2012 22:10:28, всего редактировалось 1 раз.
NTFS
постоялец
Сообщения: 388
Зарегистрирован: 05.11.2007 13:57:50
Откуда: Краснодар
Контактная информация:

Сообщение NTFS »

iskander

Чаще всего да. Мне как-то странно представить, чтобы Паскаль массово применяли для разработки веб-приложений или драйверов устройств. Я, правда, делал и то, и другое - но это уже из разряда: "Месье знает толк в извращениях!" :-)
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

Сообщение leo_bsv »

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

ну так тож опять для каждого класса все свойста в ней перебирать при сравнении?... хотелось именно это объехать... :D
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Сообщение leo_bsv »

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

я НЕ имел ввиду это

Код: Выделить всё

Compare(x:TMyPants;y:TMySocks):boolean

я имел ввиду вот это

Код: Выделить всё

Compare(x,y:[TMySocks or TMyPants or TMySomethingElse]):boolean

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

Сообщение alexs »

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

Сообщение leo_bsv »

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

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

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

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

в этом случае возможно сравнивать свойства классов-потомков в методе родителя?
мб пример? как в этой функции перебрать свойства любого класса-потомка?
опять же чтобы сделать метод достаточно универсальным, а не возвращаться к писанине для каждого класса, как это было бы с перегружаемой функцией...
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

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

Сообщение leo_bsv »

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

да, правильно понял. tnx!

Код: Выделить всё

  If Source is TCollection then

то что я хотел узнать.
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

Берем пример класса, в нем есть переменные класса. Некоторые переменные имеют типы чисел (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);
...

Дальше базовый класс у меня уже знает, какие поля у меня есть, и я для них уже пишу функционал типа сохранения, загрузки, сравнения, редактирования и т.п.
Ответить