Size: a a a

2020 March 11

VA

Viktor Akselrod in Delphi & Lazarus
ты можешь это легко проверить, TypeInfo(T) и посмотреть какой реально тип
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
твоя единственная претензия в том, что нельзя сравнивать простые типы без компаратора?
нет. это  очень частный случай. причем другой.
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
нет, поле имеет реальный тип, те который ты указал.
есть баг с тем, что неверно интерпретируется вызов обычного, невиртуального метода
каким образом их этого поля может вызываться левый метод? которого в типе нет?
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
каким образом их этого поля может вызываться левый метод? которого в типе нет?
но мы же выяснили, что это баг.
убедись, что T имеет правильный типа в рантайме
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
но мы же выяснили, что это баг.
убедись, что T имеет правильный типа в рантайме
и что это даст? даже если имеет? метод-то правильный не вызовешь
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
и что это даст? даже если имеет? метод-то правильный не вызовешь
ну дак я о чем и говорю - одна проблема есть.
почему ставить крест на всех женериках?
ну и достаточно не допускать ошибок проектирования классов 🙂
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
ну дак я о чем и говорю - одна проблема есть.
почему ставить крест на всех женериках?
ну и достаточно не допускать ошибок проектирования классов 🙂
ок, а как правильно спроектировать? ну для случая сортировки коллекции, например
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
ок, а как правильно спроектировать? ну для случая сортировки коллекции, например
конкретно в твоем изначальном примере сделать метод виртуальным
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
конкретно в твоем изначальном примере сделать метод виртуальным
т.е. "правильно" это не использовать женерики. и иметь при сортировке вызов виртуального метода на каждое сравнение?
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
т.е. "правильно" это не использовать женерики. и иметь при сортировке вызов виртуального метода на каждое сравнение?
правильно - это не иметь в иерархии классов одноименные невиртуальные методы.
я говорил только об этом.

по поводу сравнения - надо использовать компараторы. другого варианта нет.
может быть было бы неплохо иметь такой констрейнт, чтобы обойтись без компаратора для стандартный value types, но его нет.
обидно, но не страшно. всегда есть  TComparer<T>.Default
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
правильно - это не иметь в иерархии классов одноименные невиртуальные методы.
я говорил только об этом.

по поводу сравнения - надо использовать компараторы. другого варианта нет.
может быть было бы неплохо иметь такой констрейнт, чтобы обойтись без компаратора для стандартный value types, но его нет.
обидно, но не страшно. всегда есть  TComparer<T>.Default
а как же производительность? ну ее?
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
а как же производительность? ну ее?
нет конечно, не "ну ее". и я выше об этом написал - было бы приятно иметь такой бонус.

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

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
нет конечно, не "ну ее". и я выше об этом написал - было бы приятно иметь такой бонус.

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

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
практически так. то, что не нужны тайпкасты - хорошо, но не достаточно.
а баг влияет не только на сравнение, но и вообще на любую параметризацию кодом. подсчет хешей для мап - аналогично - виртуальный вызов на ровном месте.
конкретно мне это понадобилось, чтобы параметризовать класс, обрабатывающий данные, классом, эти данные предоставляющим. т.к. это может быть просто буфер в памяти, а может быть поток, и т.п.
и вот пока этот класс был один - все работало. а как появился другой - радостно вызываются методы базового.
повторюсь, у тебя специфичный случай, хотя это и не оправдывает наличие бага.
если использовать delphi way, то виртуальных методов не будет, тк будут вызовы методов  интерфейса (обычные методы, не вирт), как для сравнения, так и для подсчета хэша мапы
источник

SB

Sergey Bodrov in Delphi & Lazarus
А где почитать про "виртуальные методы женериков"? Такое интересное извращение, а я с ним не знаком.
источник

SB

Sergey Bodrov in Delphi & Lazarus
И про компаратор женериков. заодно
источник

SB

Sergey Bodrov in Delphi & Lazarus
Интересно, кто такую дикую дичь придумал?
источник

МС

Максим Сысоев in Delphi & Lazarus
Чем тебе компаратор не угодил?
источник

AS

Alexey Shumkin in Delphi & Lazarus
George Bakhtadze
а женерики из списка преимуществ над D7, похоже, можно вычеркивать. Нафиг такие женерики не нужны
Ну, вычеркни для себя, раз ты так настойчиво этого хочешь... От этого у СЕ не сильно убудет аргументов "за"
источник

SB

Sergey Bodrov in Delphi & Lazarus
Максим Сысоев
Чем тебе компаратор не угодил?
Он сделан в виде интерфейса с женериком? Я потрясен.
источник