![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Rohoss |
|
||||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Есть класс с множеством методов
Мне нужно вызывать разные методы этого класса, типа как здесь
только здесь у процедуры один параметр, а мне нужно чтобы количество параметров менялось. Для того чтобы этим процедурным типом можно было вызвать любой метод класса TCommands Надеюсь у меня получилось правильно выразить мысль ![]() Это сообщение отредактировал(а) Rohoss - 19.8.2008, 20:38 |
||||
|
|||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Возможно ли такое вообще?
|
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
хм, ну в принципе как Tnte объявишь, так и вызывай... в чем проблемма то? -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Так функции имеют разное количество параметров, причём не известно, сколько их будет (параметров).
Добавлено через 1 минуту и 45 секунд Нужно как-то Tnte объявить как функцию с динамическим количеством параметров. Добавлено через 7 минут и 14 секунд Можно было параметром использовать динамический массив, но класс TCommands уже определён |
|||
|
||||
Zmiy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 3.3.2007 Репутация: нет Всего: 2 |
Rohoss, все параметры - строки?
Добавлено через 10 минут и 58 секунд Не знаю, попробуй
или
|
||||
|
|||||
ama_kid |
|
||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||
|
|||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Да
Сделал типо теста, сообщения выходят бредовые… |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
ama_kid немного не то… Тип должен использоватся для функции с разным количеством параметрами, а у тебя параметр массив…
Это сообщение отредактировал(а) Rohoss - 20.8.2008, 23:18 |
|||
|
||||
ama_kid |
|
||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
![]()
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||
|
|||||
Felan |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Тебе придется делать метод с переменным числом аргументов, потом проверять типы и приводить типы аргументов. Без этого не как. Есть другой вариант,
если есть возможность переделать архитектуру классов, то смотри в сторону паттерна проектирования Command. И, если неизвестно изначально, какие команды могут быть, смотри виртуальные конструкторы. Общая суть такая:
Тест кода:
Это сообщение отредактировал(а) Felan - 21.8.2008, 08:42 -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||
|
|||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
ama_kid либо я не понял твоего примера, либо ты не понял что я хочу…
Есть, к примеру, текстовый файл fun.txt
приложения должно читать каждую строчку этого файла, вызывать метод класса TCommands и передавать этому методу параметрами то что идёт после пробела. «&» - разделитель между параметрами. Команды класса TCommands будут добавляться, а некоторые будут экспортироваться с dll, поэтому заранее определить не получится. Добавлено через 10 минут и 56 секунд Felan в твоём примере запутался, разберусь и отпишусь чуть позже… ![]() Это сообщение отредактировал(а) Rohoss - 21.8.2008, 21:40 |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Rohoss, может и глупость сейчас говорю... Но что если сделать тип TNte с максимальным для методов класса TCommands параметров?
То есть например:
|
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Felan для каждой команды создавать свой класс?
![]() Добавлено через 4 минуты и 38 секунд THandle там точно есть команда с больше чем десятью параметрами… это не весь код класса TCommands. Пока единственный способ вижу изменять класс TCommands (сделать параметром динамический массив), но этого очень не хотелось. |
|||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Почитай про паттерны проектирования. Это паттерн "Команда" и все станет понятно. ![]() Ну и что? В чем проблема-то? Зато каждая команда будет полностью самостоятельной единицей, которую ты сможешь править независимо ни от чего, и все изменения будут локализованы. Лучше что-ли когда у тебя класс с мильоном методов, да еще не дай бог, перегруженных? Да с переменными аргументами? Да тип у этих аргументов общий, который нужно приводить на месте к нужному типу? Да за порядком этих аргументов нужно тщательно следить, за безопасностью типов тоже... за их правильным приведением... Чуть что, все надо перелопачивать... опухнуть можно ![]() И вот это как раз реализуется отлично. В моем примере добавляешь абстрактный метод Parse, в каждой команде реализуешь специфичный для нее парсинг строки. Динамически, создаешь нужную команду и выполняешь ее.... Все работает. В принципе, я тебе даже показал способ как можно команды без перекомпиляции добавлять... Только нужно будет их хранить в длл, и использовать паккаджи для общих классов. ЗЫЖ Логика такая. Есть базвый класс команды. Он используется для полиморфного выполнения и передачи объекта !ЛЮБОЙ! команды, которая унаследована от него (тут правда можно еще интерфейс использовать, но тогда не получит использовать виртуальные конструкторы напрямую). Каждая команда предаставляет собой класс-наследник базовой команды, которые реализует специфичный для себя функционал и инкапсулирует в себе все вспомогательные действия типа парсинга строки команды.... Все команды выполняются единообразно, после того как создается и настраивается класс команды. Их даже хранить не надо, создал команду, когда понадобилась, выполнил ее, уничтожил... Это сообщение отредактировал(а) Felan - 22.8.2008, 07:29 -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Felan, вопрос в том, чтобы не переопределять класс TCommands
Добавлено через 12 минут и 8 секунд А если уже без переопределения класса никак, то чем твой метод лучше от использования динамического массива? 1. Не нужно процедуру парсинга писать для каждой команды. 2. Получится более компактно. 3. Можно использовать общие поля класса для всех команд |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |