|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Привет. Вопрос такой. Есть иерархия классов. Используем язык C#. Но проблема в том, что основной метод, вокруг которого фактически и крутится класс, в разных классах имеет разное количество параметров. Дело вот в чем. Есть класс. Он в себе хранит некие данные. И динамически-периодически, у него нужно дергать метод (который вот и нужно придумать как описать), куда передавать самые последние данные. Проблема усложняется тем, что в иерархии разные наследниики имеют разное кол-во параметров в этой самой функции. PS. Иерархия все же нужна. Т.к. по сути, все классы там делают одну работу. Просто часть функций виртуальные, и каждый класс через них и делает свою уникальную обработку. Мне нужно сделать некий интерфейс, описывающий работу этой иерархии. Пока есть 2 варианта. 1 Сделать нечто, похожее на класс system.eventargs из C# Т.е. сделать в методе всего лишь один входной параметр, принимающий на вход абстрактный класс- и для каждого класса в иерархии, создать класс наследник этого "eventargs" хранящего специфичные данные. Но что-то не очень мне нравится эта идея. 2. Использовать шаблоны. Но не уверен, что получится правильно. Как быть ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 12:11 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
АаархиНо проблема в том, что основной метод, вокруг которого фактически и крутится класс, в разных классах имеет разное количество параметров. Пока есть 2 варианта. 1 Сделать нечто, похожее на класс system.eventargs из C# Т.е. сделать в методе всего лишь один входной параметр, принимающий на вход абстрактный класс- и для каждого класса в иерархии, создать класс наследник этого "eventargs" хранящего специфичные данные. Но что-то не очень мне нравится эта идея. 2. Использовать шаблоны. Но не уверен, что получится правильно. Как быть ? 3. Сделать метод с одним входным параметром - структурой или XML-файлом ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 12:26 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи, А какой язык реализации? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 12:52 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
ДжекНепотрошитель, я же первым вариантом это написал :)) Сделать на подобии system.eventargs, от которого и наследюутся все аргументы ивентов. Но мне не нравится этот вариант. Просто как-то не красиво получится. Передавать везде тип Object (из C#) и в каждом методе кастовать его в нужный объект. Ну или XML там, или еще чего. Можно например еще Словарь передавать, где будут string ключи с именем параметра, и Object во втором поле, ну и опять касты будут... Неопрятно все это как то. MasterZiv, я же во второй строчке это написал :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 13:49 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Я в принципе не отрицаю варианта с использованием XML например. Просто хочется узнать мнение опытных разработчиков систем. Как этот вопрос решается вообще. Очень часто так бывает, что в наследуемом классе метод должен частично поменятся. Как это решается в ООП ? Тут еще такое дело. Все было бы просто, если бы все можно было бы передавать в конструктор все различные параметры, а в комде вызывать метод без параметров. Но тут дело именно в том, что метод нужно вызывать постоянно - и класс, в соответствии с имеющейся у него УЖЕ информацией, обрабатывает новые данные. То бишь конструктор пролетает... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 13:58 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
skyANAАаархи, что за методы? Что за предметная область? Предметная область: нужно обрабатывать данные с некторых датчиков. Датчики разных производителей и предоставляют разные наборы данных. По сути делают они одно, но наборы данных несколько различны. От того и выходит, что часть входных параметров метода у классов-предков разные. Нужно придумать общий интерфейс, но вот параметры отличные получаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 15:00 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи2. Использовать шаблоны. Но не уверен, что получится правильно. Generic-типы должны решить проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 15:05 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи Передавать везде тип Object (из C#) и в каждом методе кастовать его в нужный объект. Ну или XML там, или еще чего. Можно например еще Словарь передавать, где будут string ключи с именем параметра, и Object во втором поле, ну и опять касты будут... Нет, ты не понял, я другое имел в виду. Не надо никаких Object, и ничего не надо кастовать. Передавай универсальный контейнер, а не типизированный объект. Или XML, или список строк "параметр=значение". А каждый класс пусть вычитывает из него нужные значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 15:05 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
у меня вот идея такая: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 15:31 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи, вам шашечки или ехать? Описывается Предметная область и определяется граница статики и динамики. Если вы все параметры запихаете в объект или укзатель на кусок памяти, то вы теряете контроль над Моделью. Это всё равно что запихать динамику в БД в виде EAV. Оооочень гибко, но геморрой. - Разбейте функции на несколько мелких. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 16:10 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
АаархиНо проблема в том, что основной метод, вокруг которого фактически и крутится класс не может класс крутиться вокруг основного метода. Если у вас предметка - Вход-Выход-Конвейер, то применяйте соответствующие шаблоны. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 16:12 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
такое решение трудно будет поддаваться отладке, изменению, и вообще, использование жирных-супер-пупер-классов не есть гуд... в конце концов запутаешься в этой куче входных параметров и функционале их обработки... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 16:15 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Petro123, что значит "определяется граница статики и динамики" ? интересно весьма. Гугл говорит, что это к анатомии относится :) Ткните в чего почитать. Да тут дело даже не в том, чтобы "разбить функцию на множество мелких". Меня интересует только вот что: В методах классов, порожденных от одного предка - в принципе входные параметры разные. Как быть тут с построением общего интерфейса ? И как быть, если появятся новые датчики и мне хочется чтобы можно было создать новый класс, возможно с новым списком параметров, порожденного от базового класса. Неужели прощай иерархия классов, только из-за некоторого различия параметров ? Вот что меня интересует. Хочется узнать как решить такую проблемку :) PS. Я вообще интересуюсь чисто из академического интереса. Если интересного решения предложено не будет. Буду конечно делать все по тупому. Но просто вот хочется узнать великого Олла, может чего придумано на этот счет. Думаю о реализации через генерики наверное. Или может таки через Словарь Ключ=параметр. Но это все в худшем случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 16:46 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
a_titeevтакое решение трудно будет поддаваться отладке, изменению, и вообще, использование жирных-супер-пупер-классов не есть гуд... в конце концов запутаешься в этой куче входных параметров и функционале их обработки... Так для того и нужно наследование. Каждый класс в своих виртуальных методах работает индивидуально со своими уникальными параметрами. Надеюсь не запутаюсь :) Ну по крайне мере не больше, чем если буду передавать в метод Словарь со списком параметров, и уже в классах парсить его. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 16:48 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
[quot Petro123]Ааархине может класс крутиться вокруг основного метода. Да как раз таки может. Если классы делать максимально маленькими и занимающимися только своим четко очерченым функционалом. В таком случае у класса по сути и может быть как раз пара тройка методов: ну там инициализация, и сама работа. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 16:58 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
PS. Вот кстати сейчас что читаю по своему вопросу http://www.objectmentor.com/resources/articles/isp.pdf Статья Мартина Фаулера. Где он описывает "толстые интерфейсы" и рекомендует использовать "тонкие". Описывая как раз мою проблему - когда есть классы предки, с разным функционалом. Мощно.... Вникаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 17:03 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи, Так ничего и не понял из топика темы. Если вы сократите текст поста и опишете не то, что у вас уже сделано, а кусочек задачи, для которой нужно сделать обьектную модель, то может чем-то смогу помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 17:48 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
В общем, ТС все-таки склоняется к разработке очередного программного монстрика. Не важно, что нагромождение классов будет предназначено для примитивной задачки передачи параметров, зато усё будет объектно-ориентированненько :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2013, 18:00 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи, Можно выделить общие параметры полиморфных методов и оставить их в виде параметров, а все остальные параметры передавать до вызова данного полиморфного метода в одном или нескольких вызовах. Объект при этом должен запомнить эти данные и сохранить их до момента обработки. Вспомогательные методы могут быть как плавными, так и нет. Можно инкапсулировать параметры в объект, возможно, тоже полиморфный (будет своя иерархия таких объектов) В итоге получится как бы множественная диспетчеризации, но только по первому параметру , т.е. как бы диспетчеризации 1.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2013, 00:49 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
[quote Ааархи]Petro123Ааархине может класс крутиться вокруг основного метода. Да как раз таки может. Если классы делать максимально маленькими и занимающимися только своим четко очерченым функционалом. В таком случае у класса по сути и может быть как раз пара тройка методов: ну там инициализация, и сама работа. Искусство художника - отсечь из камня лишнее. Искусство архитектора - не идти на крайности в обе стороны. Тогда не будет у тебя Жирного класса и Класса с 2-мя методами. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2013, 10:27 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
MasterZiv, +1 когда много параметров делают так: Объект.Создать Объект.ИнициализацияПараметрами О.МетодПолныйООП() ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2013, 10:30 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
>Ааархи, 25 янв 13, 15:00 [13828401] >Предметная область: нужно обрабатывать данные с некторых датчиков. Датчики разных производителей и предоставляют разные наборы данных. Для своих целей (параметры SQL запроса) поступил так: 1. Знал максимально возможное число параметров SQL запроса, 2. Неиспользуемые SQL параметры текущего запроса кодировал - nul 3. "Ручками" сериализовал набор параметров SQL запроса и получал byte[] - параметр запроса удаленному методу. Вы же можете добавить в сериализацию дополнительный параметр - тип датчика. С уважением, Владимир. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 12:06 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи1 Сделать нечто, похожее на класс system.eventargs из C# Т.е. сделать в методе всего лишь один входной параметр, принимающий на вход абстрактный класс- и для каждого класса в иерархии, создать класс наследник этого "eventargs" хранящего специфичные данные. Но что-то не очень мне нравится эта идея. Вопрос, почему не нравится? Если где-то эти параметры обрабатываются как одно целое, то и надо их представлять одним целым. А если вызывающий код и реализация метода все равно зависит от состава параметров, зачем тут полиморфизм? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 12:49 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
авторНеужели прощай иерархия классов, только из-за некоторого различия параметров ? Если проблема только в "некоторых различиях параметров", то напиши обработку этих различий. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 14:07 |
|
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
|
|||
---|---|---|---|
#18+
Ааархи, Так понимаю стоит задача написать функцию которая может принимать любые параметры. Объект сам решит как с этим счастьем работать. Главное передать. В С++ есть такие "ассоциативные контейнеры" std::map<Key, Value>. Можно сделать Код: plaintext 1.
Короче простое хранилище ключ - значение. Его то и можно передать как аргумент. Подозреваю что C# тоже есть такое и это вполне может быть аргументом функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2013, 21:51 |
|
|
start [/forum/topic.php?fid=33&fpage=17&tid=1547694]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 300ms |
total: | 437ms |
0 / 0 |