|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
20.03.2023, 17:28 | #1 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
свой метод Sort для TList<MyType>
Подскажите, давно не брался за Delphi.
Я правильно понимаю, что для System.Generics.Collections.TList нельзя переопределить метод сортировки Sort не создавая наследника? Как, к примеру, это можно сделать с методом сравнения, реализовар свой экземпляр интерфейса IComparer<T>? Делать какой-то класс-обёртку не получается. В том смысле, что у меня всё равно нет доступа к полю FList. Только свойство List, которое readonly. Код:
Цитата:
Или я вообще не туда еду? |
|
20.03.2023, 17:57 | #2 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
Какую-то такую аброказябру сделал.
Код:
Код:
|
21.03.2023, 09:07 | #3 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 156
|
Если я правильно понял, то нужно что-то вроде:
Код:
Код:
|
21.03.2023, 09:38 | #4 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
DIONISKA, не не, мне не Comparer нужно переопределить. Мне нужно изменить сам метод сортировки. Ну например сделать её многопоточной.
Цитата:
Вопрос по Comparer тоже имеется, но для него я отдельную тему сейчас создаю. |
|
21.03.2023, 11:06 | #5 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 156
|
А, так вопрос стоит именно в том чтобы усложнить.. Возможно стоит переопределить класс, добавив свою процедуру сортировки:
Код:
|
21.03.2023, 11:27 | #6 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
DIONISKA,
Цитата:
Например, я вполне могу управлять стилями отрисовки окон не имея отношения к их созданию и наполнению. Проект может быть уже давно разрабатывамым, но при этом мне ведь не нужно создавать новый тип и заставлять всех переделывать свой код. Мне достаточно лишь гарантии,что все окна являются потомками TForm, и через класс TForm я ими и управляю. |
|
21.03.2023, 12:49 | #7 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 156
|
задача из разряда "чёрный ящик" - это не самая благодарная работа. Допустим исходные данные будут потомками System.Generics.Collections.TList<T >. В потомках многое может претерпеть изменения,включая логику хранение данных, а не только методы, потому как Потомок!=экземпляр. Допустим будет введен какой-нибудь массив хэшей, который будет использоваться для быстрого поиска, который будет перестраиваться после выполнения метода sort, add, insert или exchange. Что будет если вы попытаетесь применить к такому наследнику метод сортировки от родительского класса? А ваш собственный метод?
Почему вас так страшат наследники классов? Недолюбливаете ООП? Если Базовый класс у них один, то его методы будут работать с обоими наследниками, даже если они переопределены. В вашем наследнике можно также переопределить метод и это всё равно будет работать. Код:
оффтоп: А теперь на минутку представьте что тут в классе TNOTmyList переопределен метод Sort примерно как я говорил в начале, и это нигде не задокументировано, не описано и у вас на руках dcu-шка и вам либо заниматься реверс-инжинирингом либо искать того кто десять лет назад уволился и не написал документации, а тот уже сам не помнит :D |
21.03.2023, 13:30 | #8 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
DIONISKA, ты привёл пример, где создаёшь свой наследник от TList<T>. В нём переопределяешь метод Sort. Но другие коллекции будут тоже наследниками от исходного TList<T>. Они на другой ветке наследования и твой Sort не увидят. Поэтому приходится жёстко приводить к своему типу. А вот это да, уже не хорошо.
В предложенном мной выше варианте черного ящика нет, так как с экземплярами я работаю через public свойства базового класса. Это по всем правилам ООП. |
21.03.2023, 14:12 | #9 | |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 156
|
Цитата:
Если обращаться к ним как к наследникам моего класса,то как раз увидят, никто не отменял возможность приведения классов, у меня он например приведен не явно тут: Код:
Если-бы шла речь не о дженериках с их спецификой, то можно было-бы сделать всё красивее, использовать например class/record helpers, но подружить хэлперы с джерениками с их уровнем абстракции на мой взгляд если и возможно, то только с костылями. Также не работает создание dummy класса, тот самый грязный "хак"(что обычно позволяет сделать "friendly-class") для получения доступа к protected полям класса, поэтому и нет возможности получить прямой доступ к fitems и fcomparer у TList<T>. |
|
21.03.2023, 14:27 | #10 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
DIONISKA, это всё я понял. Приведение типов использовать не люблю. Да и не нужно оно тут, так как работать можно через public свойства и методы просто через свой отдельный класс-дженерик от того же базового типа.
Короче, я уже смирился с обёрткой. Ща еще кое что допилю (а то пока эксперементировал, вообще всё сломал)))) и выложу сюда. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Метод Sort | shchelelv | Microsoft Office Excel | 2 | 07.12.2017 15:07 |
Метод Sort | Vasya25 | Microsoft Office Excel | 4 | 21.05.2012 23:19 |
Создать тип даных: TYPE MyType = от 1 до 150 | ArtGrek | Общие вопросы Delphi | 11 | 10.01.2012 22:50 |
Не работает метод SORT | leonard | Microsoft Office Excel | 0 | 17.05.2011 13:18 |
TList->Sort | ongleb | Общие вопросы C/C++ | 0 | 12.03.2010 14:58 |