![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Koster |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.6.2008 Репутация: нет Всего: нет |
В общем тема сложная для обьяснения. У меня есть два класса:
задача состоит в том как надо извратиться чтобы можна было выполнить данный код:
В классе TFloat не должно быть описания метода find полностью, т.е. основа (сам поисковый цыкл) должен остаться в классе TBase, чтобы можна было создавать другие типы на основе TBase и использовать его метод find. Я реализовал это таким образом:
В общем это работает, НО тут используется тип variant, который не может хранить указатель, да к тому же усложняет поиск ошибок связанных с несовместимостью типов. Мне хотелось бы узнать как это можна написать без вариантов? Это сообщение отредактировал(а) Alexeis - 3.6.2008, 09:24 |
||||||
|
|||||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Сделай перегрузку в базовом классе... а вообще-то, фигню ты придумал. Может оп другому как-то это на классы разбить?
ЗЫЖ Public, Published и Protected члены и так доступны в наследниках. Так что для их вызыва из потомка вообще ничего делать не надо. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
Если я правильно понял вопрос, то я присоединяюсь к совету Felan. Что мешает использовать перегруженные (overload) функции? Создай свою функцию на каждый необходимый тебе тип в классе TBase:
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
а что мешает в базовом классе оперировать с double
ведь в переменную double не составит труда передать Integer а при необходимости доделки метода - переопределять его в потомке и дописывать юзая метод предка через inherited
Это сообщение отредактировал(а) pseud - 3.6.2008, 09:30 -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Koster |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.6.2008 Репутация: нет Всего: нет |
Начну по порядку.
Мешает то что заранее неизвестно какого типа будет передаваться элемент. Задача состоит в том чтобы можна было добавлять новые классы с новыми типами не меняя базовый. А типы могут быть любыми, вплоть до других классов. Перебрать их всех невозможно.
Думаю с предыдущих строк уже понятно, что типы которые передаются в метод find могут быть не только чисельные, а и сложные. Например string. Мое решение имеет недостаток в том что variant не может хранить указатели, а значит и сложные структуры данных типа классов. Поэтому хочется узнать как избавиться от variant'ов, если это конечно возможно на Delphi (на что я искренне надеюсь). А если невозможно, тогда может кто то скажет есть ли язык в котором это возможно. Это сообщение отредактировал(а) Koster - 3.6.2008, 16:55 |
||||
|
|||||
| pseud |
|
||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
тогда так
Добавлено через 4 минуты и 21 секунду ======================== или даже так
Добавлено через 6 минут и 38 секунд ========================= хотя, признаюсь, смысловой нагрузки в мною написанном наблюдаю слабо -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||
|
|||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
====================
а, вообще, - поддерживаю ama_kid. overload тебе в руки. главное объяви эти методы в базовом классе. а реализацию пиши в каждом отдельном потомке на свой метод. пример.
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Koster |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.6.2008 Репутация: нет Всего: нет |
overload я понимаю как тут использовать. Это не проблема. Хотелось узнать как можно глубже Delphi.
Просто, а если исходника класса TBase нет под рукой, тогда как быть? А можете обьяснить по подробнее про reintroduce. Я не совсем понимаю смысл ее. Это сообщение отредактировал(а) Koster - 3.6.2008, 19:17 |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Типо замещает методы описанные в классе родителе и позволяет менять тип… Что-то вроде overload и override вместе взятых…
|
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Да элементарно. Только для этого надо, как я тебе уже говорил, переделать структуру классов. Если у тебя всегда на этапе компиляции будут известны типы, которыми ты хочешь оперировать в базовом классе, то можно использовать виртуальные конструкторы для динамического создания объекта нужного класса. Или же можно сделать отдельный класс-менеджер, который выполняет нужные тебе функции с объектами и будет принимать определенный интерфейс (или базовый класс, но тогда надо будет делать наследников, а это не так эффективно) для того, что бы обрабатывать эти объекты. А все твои классы, которые ты хочешь использовать реализуют этот интерфейс (или наследуются от нужного базового класса). Т.о. при создании нового класса, который должен использоваться твоим классом-менеджером нужно просто реализовать интерфейс или перекрыть нужные методы, и базовый класс трогать не надо. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
тогда переопределяй метод как я уже писал выше reintroduce. но тогда, используя метод Find в потомках, ты не сможешь использовать его в предыдущей интерпретации. т.е. твой код все равно не заработает Koster,
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Koster |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.6.2008 Репутация: нет Всего: нет |
А можна ли сделать чтобы заработал таки? Или это я слишком много требую? |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
только если так:
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Beltar |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Если я правильно понял, тут не ООП ИМХО применять надо, а ф-ии обратного вызова. И ничего наследовать не понадобиться. Как и создавать для каждого типа данных свой класс. Объявляй Find с параметром типа Integer или Pointer и суй него указатель на функцию поиска. Например так. У меня в одной софтинке есть TreeView и 2 способа сортировки узлов. Объявляю их так. Ни в коем случае не методы формы.
Или проще процедурный тип используй. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
||||
|
|||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
Beltar, помоему ты не правильно понял вопрос.
т.е. есть класс TBase в каком-то dcu или еще где-то. и надо понасоздавать его потомков с теми же функциями/процедурами но иной реализацией. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |