Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/20: Рейтинг темы: голосов - 20, средняя оценка - 4.85
4 / 4 / 0
Регистрация: 07.05.2009
Сообщений: 29

перегрузка функций

10.07.2009, 14:05. Показов 3696. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void A(int arg)
{
//реализация 1
}
 
private void A(double arg)
{
//реализация 2
}
 
private void B(int arg)
{
//реализация
A(arg);
//реализация
}
 
private void B(double arg)
{
//реализация
A(arg);
//реализация
}
Перегруженный метод В имеет одно и тоже тело, за исключением типа параметра в А. Как наименее коряво унифицировать такой код?
При использовании шаблонов <T> компилятор ругается на несоответствие типов - T он воспринимает как object.
Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.07.2009, 14:05
Ответы с готовыми решениями:

Перегрузка функций
А каковы в C# правила подбора подходящей функции из набора перегруженных?

Перегрузка функций (методов) и операций
Добрый день. Мне тут помогли написать код... нужно пояснение полное в коде что тут и как происходит. Само условие выглядит так: Создать...

Создать массив n функций и вывести полную информацию о значении данных функций в точке х
Создать абстрактный класс Function с методом вычисления значения функции y=f(x) в заданной точке. Создать производные классы: Line...

17
0 / 0 / 0
Регистрация: 13.07.2009
Сообщений: 4
13.07.2009, 15:48
возможно так-по крайней мере кода меньше....

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
void A(object arg)
        {
            
        }
        void B(object arg)
        {
            if (arg is int)
                A((int)arg);
            else if (arg is double)
                A((double) arg);
            else
                throw new ArgumentException("!!!", "arg");
        }
0
 Аватар для exe-dealer
308 / 161 / 11
Регистрация: 07.06.2009
Сообщений: 538
13.07.2009, 16:54
private void A<T>(T arg) where T : struct
{
//реализация 1
}
0
4 / 4 / 0
Регистрация: 07.05.2009
Сообщений: 29
13.07.2009, 19:22  [ТС]
спасибо, конечно за ответы, но:
1) fromrus, если я использую В в цикле, то у меня проверка на тип аргумента выполныется два раза за итерацию, а это мне совсем ненадо.
2) exe-dealer, я писал, что компилятор такое не хавает. Метод А требует конкретный тип аргумента int или double, а дженерики он рассматривает как object независимо от ограничений, и хочет привести его к int или double, и не может!

Вот мой вариант, но мне он ненравится:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
private void A(int arg)
{
//реализация 1
}
 
private void A(double arg)
{
//реализация 2
}
 
int agrInt;
double agrDouble;
 
private delegate void CrutchDelegetate();
 
private void CrutchInt()
{
      A(argInt);         
}
 
private string CrutchDouble()
{            
      A(argDouble);
}
 
private void B(CrutchDelegetate Crutch)
{
//реализация
Crutch();
//реализация
}
 
private void C()
{
CrutchDelegetate crutch;
if (/*выражение*/)
   crutch = CrutchInt;
else
   crutch = CrutchDouble;
///что-то
B(crutch);
}
На C# пишу относительно недавно, если у кого есть опыт, подскажите пожалуста.

Добавлено через 12 минут 27 секунд
exe-dealer, это если у вас в посте опечатка и вы имели ввиду таки В, а не А. Если же Вы имели ввиду именно то, что написали , то замечу, что А для разных аргументов имеет абсолютно разные реализации, шаблоны там не помогут. Посему в листинге я написал "//реализация 1" и "//реализация 2"
0
 Аватар для exe-dealer
308 / 161 / 11
Регистрация: 07.06.2009
Сообщений: 538
13.07.2009, 19:44
не совсем понял в начале. Я подумал что с шаблонами проблема.

может вот так пойдет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void A(int arg)
{
//реализация 1
}
 
private void A(double arg)
{
//реализация 2
}
 
private void B(int arg)
{
B((double)arg);
}
 
private void B(double arg)
{
//реализация
A(arg);
//реализация
}
0
4 / 4 / 0
Регистрация: 07.05.2009
Сообщений: 29
13.07.2009, 21:15  [ТС]
вот так и плодятся незримые баги
у меня абсолютно различные реализации А для int и double, хоть они и возвращают один тип, но результат-то разный! Ты же предлогаеш отказаться от целочисленной реализации А
Пример реальной задачи с такой ситуацией - когда надо что-то посчитать с абсолютным (int) и относительным (double) порогами. Тип возвращаемого аргумента один, а реализации абсолютно разные.

З.Ы. все еще актуально
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
13.07.2009, 21:22
exe-dealer, при таком подходе A(int arg) так никогда и не вызовется .

fromrus, а зачем было функцию A сводить в одну с параметром obj, если в функции B в зависимости от типа входного параметра делать приведение к конкретному типу ?
В любом случае, по постановке задачи, реализация функций A(int arg) и A(double arg) отличается и по-этому общую функцию А получить не выйдет.

9h05t, несколько замечаний.
Второй твой вариант позволяет написать реализацию функции В один раз, но он, ИМХО, ничем не лучше варианта fromrus, если тебя в нем не устраивала скорость.
Дело в том, что вызов каждой функции связан с накладными расходами (выкладывание параметров на стек, переход по новому адресу, снятие параметров со стека, возврат), а у тебя по сравнению с предложением fromrus добавилось 2 лишних вызова функций: 1) из С вызов B(crutch), 2) из В вызов функции-делегата и только потом идет вызов целевой функции А. Тем более, что какая-то проверка у тебя в функции С остается.
Проверка типа параметра и последующее его приведение решение не совсем элегантное, но в плане скорости не должно особо пугать, особенно когда после этого начинаешь придумывать что-то вообще страшное .

Но у меня возник вопрос, а что это за методы А такие, что у них разная реализация в зависимости от типа параметра? Можешь подробнее рассказать о том, что ты пытаешься реализовать? Может получится найти решение не там, где ты ожидаешь .
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.07.2009, 22:09
Если так всё плохо - я бы на макросах сделал. Но в Си++ считается, что макрос это не по пацански и нужно использовать шаблоны. Но вот можно ли шаблоном делать метод - не уверен
0
4 / 4 / 0
Регистрация: 07.05.2009
Сообщений: 29
14.07.2009, 02:32  [ТС]
max_cn, C - это уже способ применения В, так что проверка приосходит только один раз и дополнительный вызов функции - тоже.
Я писал что этот вариант мне ненравится - и именно из-за лишнего вызова функции.
Хотелось бы еще знать что выдаст на выходе оптимизатор кода C#.

А насчет конкретики - например мне надо сделать выборку одних и тех же данных из одной и той-же таблицы, но по разным критериям. Целочисленный критерий (порог) - значит выборка идет по количеству встречаемостей в таблице, с плавающей точкой - значит по весу элемента.

А - метод в провайдере базы
В - метод в класе-надстройке над провайдером
С - метод пользователя класом
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
14.07.2009, 02:55
А если использовать второй параметр в методе A? Например булева переменная, если истина, тогда как порог, если ложь - значит по весу.
0
 Аватар для exe-dealer
308 / 161 / 11
Регистрация: 07.06.2009
Сообщений: 538
14.07.2009, 03:27
тогда не булеву, а enum чтоб читабельность лучше была.
0
4 / 4 / 0
Регистрация: 07.05.2009
Сообщений: 29
14.07.2009, 10:15  [ТС]
Green, в А выборка из базы, обработка выборки, сама по себе немаленькая, а если еще слепить два метода в 1, то будет вообще венегрет

вобщем это уже флейм пошел.
Как я понял, приемлемого стандартного решения наподобии сишных шаблонов (что есть очень неприятно и странно) в шарпе нет и надо перекраивать задачу.

Если я (надеюсь) неправ, то, пожалуста, пишите
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
14.07.2009, 12:14
9h05t, мне как то не довелось разбираться с С++ шаблонами, только слышал, что они немного мощнее generic классов C#, за счет поддержки некоторых возможностей для метапрограммирования (создание программ, создающих более сложные программы).

Нужно просто понимать, что такое generic классы C# - это классы, которые имеют ЕДИНУЮ реализацию для некоторого набора типа данных. Так что по определению твоя задача через этот механизм не решается. Зато он прекрасно подходит для создания стандартизированных контейнеров различных классов.

Уж если тебе не нравится проверять параметр в единой функции В, ИМХО, лучше написать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void A(int arg)
{
//реализация 1
}
 
private void A(double arg)
{
//реализация 2
}
 
private void B(int arg)
{
f1();
A(arg);
f2();
}
 
private void B(double arg)
{
f1();
A(arg);
f2();
}
 
private void f1()
{
//реализация начала функции В
}
private void f2()
{
//реализация конца функции В
}
, чем городить город с делегатами :-\.

Какие-то промежуточные значения, получаемые в f1(), можешь сохранить в полях класса.

Но, снова же ИМХО, куда проще написать так, как уже предлагалось (с маленьким уточнением):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void A(int arg)
{
//реализация 1
}
 
private void A(double arg)
{
//реализация 2
}
 
private void B(object arg)
{
//реализация
if (arg  is int) A((int) arg);
else (arg is double) A((double)arg);
else ...//error
//реализация
}
Главным недостатком такого метода вижу невозможность положиться на компилятор, что в функцию В будет передан параметр допустимого типа, но никак не боязнь за критичное падение скорости выполнения алгоритма.
0
0 / 0 / 0
Регистрация: 13.07.2009
Сообщений: 4
14.07.2009, 12:54
тут уж стока всего прообсуждалось,что наверное времени на выбор написания потратиось больше чем на само написание)))))если прога написана-то в виде рефакторизации дозволено,если нет-то производительней(по времени и силам) выбирать любой из предложенных вариантов)))имхО...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.07.2009, 12:56
Насколько я понял, у автора нет проблем с тем, чтобы это реализовать. Есть только вопрос, можно ли этоделать нормальными способами, а не через ж$пу
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
14.07.2009, 13:16
Для автора все, что отличается от:
C#
1
2
3
4
5
6
7
8
9
10
11
public class myClass<T> where T:int,double
{
private void A(int arg) {}
private void A(double arg) {}
private void B(T arg)
{
//реализация
A(arg);
//реализация
}
}
есть реализацией через ж.
Но так как такая запись не поддерживается компилятором (а было бы и не плохо, если бы поддерживалась ), то остается выбрать только менее извращенный вариант.

9h05t, я все никак не пойму природу твоих предубеждений перед if в функции В. Промерь при помощи Stopwatch скорость различных реализаций и убедись, что ничего страшного там нету .
0
4 / 4 / 0
Регистрация: 07.05.2009
Сообщений: 29
14.07.2009, 13:25  [ТС]
Да я понимаю, что это наименее затратный вариант, но как-то это неправильно... вроде шаблоны есть, только какие-то они ограниченые из-за строгой типизации. Вобщем сделал на if ...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.07.2009, 13:41
Проблема шаблонов не в том, что они ограничены в типизации, а в том, что их можно применять только к целиковой конструкции (классу или функции), но к отдельным методам класса нельзя
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.07.2009, 13:41
Помогаю со студенческими работами здесь

Перегрузка функций с sql запросами
Например, у меня запрос на изменение данных в таблице типов INT. Во время выполнения запроса если заполнить все поля данными типа INT, то...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу
Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу (V=4/3пиR2), конуса по радиусу основания и высоте...

Перегрузка функций. Реализация функций
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа x . Вычислить с ее помощью значение выражения z= f(a) +...

Перегрузка функций с++
Задача состоит в том, чтобы написать перегуженную функцию и то, что будет её вывзывать в перегуженной функкции надо реализовать сложение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru