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

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

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

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

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

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

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


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

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

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

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

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

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

Как быть ?

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

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

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

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


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

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

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

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


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

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

Нет, ты не понял, я другое имел в виду. Не надо никаких Object, и ничего не надо кастовать. Передавай универсальный контейнер, а не типизированный объект. Или XML, или список строк "параметр=значение". А каждый класс пусть вычитывает из него нужные значения.
...
Рейтинг: 0 / 0
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
    #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
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
    #38124970
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ааархи,
вам шашечки или ехать?
Описывается Предметная область и определяется граница статики и динамики.
Если вы все параметры запихаете в объект или укзатель на кусок памяти, то вы теряете контроль над Моделью.
Это всё равно что запихать динамику в БД в виде EAV. Оооочень гибко, но геморрой.

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

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


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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

Если проблема только в "некоторых различиях параметров", то напиши обработку этих различий.
...
Рейтинг: 0 / 0
Как реализовать полиморфизм (интерфейс), если методы имеют разное кол-во параметров ?
    #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]