Гость
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ? / 25 сообщений из 31, страница 1 из 2
25.01.2013, 12:11
    #38124399
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Привет.

Вопрос такой. Есть иерархия классов. Используем язык C#.

Но проблема в том, что основной метод, вокруг которого фактически и крутится класс, в разных классах имеет разное количество параметров.

Дело вот в чем. Есть класс. Он в себе хранит некие данные. И динамически-периодически, у него нужно дергать метод (который вот и нужно придумать как описать), куда передавать самые последние данные.

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

PS. Иерархия все же нужна. Т.к. по сути, все классы там делают одну работу. Просто часть функций виртуальные, и каждый класс через них и делает свою уникальную обработку.

Мне нужно сделать некий интерфейс, описывающий работу этой иерархии.


Пока есть 2 варианта.

1 Сделать нечто, похожее на класс system.eventargs из C#
Т.е. сделать в методе всего лишь один входной параметр, принимающий на вход абстрактный класс- и для каждого класса в иерархии, создать класс наследник этого "eventargs" хранящего специфичные данные.
Но что-то не очень мне нравится эта идея.

2. Использовать шаблоны. Но не уверен, что получится правильно.

Как быть ?
...
Рейтинг: 0 / 0
25.01.2013, 12:26
    #38124424
ДжекНепотрошитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
АаархиНо проблема в том, что основной метод, вокруг которого фактически и крутится класс, в разных классах имеет разное количество параметров.
Пока есть 2 варианта.

1 Сделать нечто, похожее на класс system.eventargs из C#
Т.е. сделать в методе всего лишь один входной параметр, принимающий на вход абстрактный класс- и для каждого класса в иерархии, создать класс наследник этого "eventargs" хранящего специфичные данные.
Но что-то не очень мне нравится эта идея.

2. Использовать шаблоны. Но не уверен, что получится правильно.

Как быть ?

3. Сделать метод с одним входным параметром - структурой или XML-файлом
...
Рейтинг: 0 / 0
25.01.2013, 12:52
    #38124481
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи,

А какой язык реализации?
...
Рейтинг: 0 / 0
25.01.2013, 13:49
    #38124638
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
ДжекНепотрошитель,

я же первым вариантом это написал :))
Сделать на подобии system.eventargs, от которого и наследюутся все аргументы ивентов.
Но мне не нравится этот вариант. Просто как-то не красиво получится. Передавать везде тип Object (из C#) и в каждом методе кастовать его в нужный объект. Ну или XML там, или еще чего. Можно например еще Словарь передавать, где будут string ключи с именем параметра, и Object во втором поле, ну и опять касты будут...

Неопрятно все это как то.


MasterZiv,
я же во второй строчке это написал :))
...
Рейтинг: 0 / 0
25.01.2013, 13:58
    #38124660
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Я в принципе не отрицаю варианта с использованием XML например.

Просто хочется узнать мнение опытных разработчиков систем. Как этот вопрос решается вообще.

Очень часто так бывает, что в наследуемом классе метод должен частично поменятся. Как это решается в ООП ?

Тут еще такое дело. Все было бы просто, если бы все можно было бы передавать в конструктор все различные параметры, а в комде вызывать метод без параметров.
Но тут дело именно в том, что метод нужно вызывать постоянно - и класс, в соответствии с имеющейся у него УЖЕ информацией, обрабатывает новые данные. То бишь конструктор пролетает...
...
Рейтинг: 0 / 0
25.01.2013, 15:00
    #38124819
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
skyANAАаархи, что за методы? Что за предметная область?


Предметная область: нужно обрабатывать данные с некторых датчиков. Датчики разных производителей и предоставляют разные наборы данных. По сути делают они одно, но наборы данных несколько различны.
От того и выходит, что часть входных параметров метода у классов-предков разные.

Нужно придумать общий интерфейс, но вот параметры отличные получаются.
...
Рейтинг: 0 / 0
25.01.2013, 15:05
    #38124829
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи2. Использовать шаблоны. Но не уверен, что получится правильно.
Generic-типы должны решить проблему.
...
Рейтинг: 0 / 0
25.01.2013, 15:05
    #38124831
ДжекНепотрошитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи Передавать везде тип Object (из C#) и в каждом методе кастовать его в нужный объект. Ну или XML там, или еще чего. Можно например еще Словарь передавать, где будут string ключи с именем параметра, и Object во втором поле, ну и опять касты будут...

Нет, ты не понял, я другое имел в виду. Не надо никаких Object, и ничего не надо кастовать. Передавай универсальный контейнер, а не типизированный объект. Или XML, или список строк "параметр=значение". А каждый класс пусть вычитывает из него нужные значения.
...
Рейтинг: 0 / 0
25.01.2013, 15:31
    #38124884
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
у меня вот идея такая:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
class Base<T> 
{
abstract void SuperMethod<T>(T item)
}

class MyFirstDatchik:Base<FirstDatchikStruct> 
{

}
...
Рейтинг: 0 / 0
25.01.2013, 16:10
    #38124970
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи,
вам шашечки или ехать?
Описывается Предметная область и определяется граница статики и динамики.
Если вы все параметры запихаете в объект или укзатель на кусок памяти, то вы теряете контроль над Моделью.
Это всё равно что запихать динамику в БД в виде EAV. Оооочень гибко, но геморрой.

- Разбейте функции на несколько мелких.
...
Рейтинг: 0 / 0
25.01.2013, 16:12
    #38124976
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
АаархиНо проблема в том, что основной метод, вокруг которого фактически и крутится класс
не может класс крутиться вокруг основного метода.
Если у вас предметка - Вход-Выход-Конвейер, то применяйте соответствующие шаблоны.
...
Рейтинг: 0 / 0
25.01.2013, 16:15
    #38124983
a_titeev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
такое решение трудно будет поддаваться отладке, изменению, и вообще, использование жирных-супер-пупер-классов не есть гуд... в конце концов запутаешься в этой куче входных параметров и функционале их обработки...
...
Рейтинг: 0 / 0
25.01.2013, 16:46
    #38125047
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Petro123,

что значит "определяется граница статики и динамики" ? интересно весьма. Гугл говорит, что это к анатомии относится :) Ткните в чего почитать.


Да тут дело даже не в том, чтобы "разбить функцию на множество мелких".

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

Неужели прощай иерархия классов, только из-за некоторого различия параметров ? Вот что меня интересует. Хочется узнать как решить такую проблемку :)


PS. Я вообще интересуюсь чисто из академического интереса. Если интересного решения предложено не будет. Буду конечно делать все по тупому. Но просто вот хочется узнать великого Олла, может чего придумано на этот счет.

Думаю о реализации через генерики наверное. Или может таки через Словарь Ключ=параметр. Но это все в худшем случае.
...
Рейтинг: 0 / 0
25.01.2013, 16:48
    #38125048
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
a_titeevтакое решение трудно будет поддаваться отладке, изменению, и вообще, использование жирных-супер-пупер-классов не есть гуд... в конце концов запутаешься в этой куче входных параметров и функционале их обработки...

Так для того и нужно наследование. Каждый класс в своих виртуальных методах работает индивидуально со своими уникальными параметрами. Надеюсь не запутаюсь :) Ну по крайне мере не больше, чем если буду передавать в метод Словарь со списком параметров, и уже в классах парсить его.
...
Рейтинг: 0 / 0
25.01.2013, 16:58
    #38125060
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
[quot Petro123]Ааархине может класс крутиться вокруг основного метода.


Да как раз таки может. Если классы делать максимально маленькими и занимающимися только своим четко очерченым функционалом. В таком случае у класса по сути и может быть как раз пара тройка методов: ну там инициализация, и сама работа.
...
Рейтинг: 0 / 0
25.01.2013, 17:03
    #38125067
Ааархи
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
PS. Вот кстати сейчас что читаю по своему вопросу
http://www.objectmentor.com/resources/articles/isp.pdf

Статья Мартина Фаулера. Где он описывает "толстые интерфейсы" и рекомендует использовать "тонкие". Описывая как раз мою проблему - когда есть классы предки, с разным функционалом.

Мощно.... Вникаю...
...
Рейтинг: 0 / 0
25.01.2013, 17:48
    #38125137
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи,

Так ничего и не понял из топика темы. Если вы сократите текст поста и опишете не то, что у вас уже сделано, а кусочек задачи, для которой нужно сделать обьектную модель, то может чем-то смогу помочь.
...
Рейтинг: 0 / 0
25.01.2013, 18:00
    #38125166
ДжекНепотрошитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
В общем, ТС все-таки склоняется к разработке очередного программного монстрика. Не важно, что нагромождение классов будет предназначено для примитивной задачки передачи параметров, зато усё будет объектно-ориентированненько :)
...
Рейтинг: 0 / 0
26.01.2013, 00:49
    #38125466
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи,

Можно выделить общие параметры полиморфных методов и оставить их в виде параметров, а все остальные параметры передавать до вызова данного полиморфного метода в одном или нескольких вызовах. Объект при этом должен запомнить эти данные и сохранить их до момента обработки.

Вспомогательные методы могут быть как плавными, так и нет.

Можно инкапсулировать параметры в объект, возможно, тоже полиморфный (будет своя иерархия таких объектов)
В итоге получится как бы множественная диспетчеризации, но только по первому параметру , т.е. как бы диспетчеризации 1.5.
...
Рейтинг: 0 / 0
26.01.2013, 10:27
    #38125566
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
[quote Ааархи]Petro123Ааархине может класс крутиться вокруг основного метода.

Да как раз таки может. Если классы делать максимально маленькими и занимающимися только своим четко очерченым функционалом. В таком случае у класса по сути и может быть как раз пара тройка методов: ну там инициализация, и сама работа.
Искусство художника - отсечь из камня лишнее.
Искусство архитектора - не идти на крайности в обе стороны.
Тогда не будет у тебя Жирного класса и Класса с 2-мя методами.
...
Рейтинг: 0 / 0
26.01.2013, 10:30
    #38125568
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
MasterZiv,
+1
когда много параметров делают так:

Объект.Создать
Объект.ИнициализацияПараметрами
О.МетодПолныйООП()
...
Рейтинг: 0 / 0
28.01.2013, 12:06
    #38127002
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
>Ааархи, 25 янв 13, 15:00 [13828401]
>Предметная область: нужно обрабатывать данные с некторых датчиков. Датчики разных производителей и предоставляют разные наборы данных.

Для своих целей (параметры SQL запроса) поступил так:
1. Знал максимально возможное число параметров SQL запроса,
2. Неиспользуемые SQL параметры текущего запроса кодировал - nul
3. "Ручками" сериализовал набор параметров SQL запроса и получал byte[] - параметр запроса удаленному методу.
Вы же можете добавить в сериализацию дополнительный параметр - тип датчика.

С уважением, Владимир.
...
Рейтинг: 0 / 0
28.01.2013, 12:49
    #38127091
F#
F#
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи1 Сделать нечто, похожее на класс system.eventargs из C#
Т.е. сделать в методе всего лишь один входной параметр, принимающий на вход абстрактный класс- и для каждого класса в иерархии, создать класс наследник этого "eventargs" хранящего специфичные данные.
Но что-то не очень мне нравится эта идея.


Вопрос, почему не нравится? Если где-то эти параметры обрабатываются как одно целое, то и надо их представлять одним целым. А если вызывающий код и реализация метода все равно зависит от состава параметров, зачем тут полиморфизм?
...
Рейтинг: 0 / 0
05.03.2013, 14:07
    #38174605
Пионэр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
авторНеужели прощай иерархия классов, только из-за некоторого различия параметров ?

Если проблема только в "некоторых различиях параметров", то напиши обработку этих различий.
...
Рейтинг: 0 / 0
18.05.2013, 21:51
    #38263568
Станислав Вл.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
Ааархи,

Так понимаю стоит задача написать функцию которая может принимать любые параметры. Объект сам решит как с этим счастьем работать. Главное передать.
В С++ есть такие "ассоциативные контейнеры" std::map<Key, Value>.
Можно сделать
Код: plaintext
1.
std::map<std::string, std::string> arguments;


Короче простое хранилище ключ - значение.
Его то и можно передать как аргумент.
Подозреваю что C# тоже есть такое и это вполне может быть аргументом функции.
...
Рейтинг: 0 / 0
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ? / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]