Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39

Не могу придумать как создать шаблонную функцию

14.07.2020, 01:54. Показов 2457. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. На данный момент в моем коде есть 3 практически одинаковых метода, которые я хотел бы объединить в один шаблонный метод. Я не очень хорошо разбираюсь в шаблонах, поэтому не могу понять, как это правильно сделать.

3 метода
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
44
45
46
47
48
49
50
public void list_of_purchases_drawing()
        {
            panel1.Controls.Clear();
 
            for (int i = 0; i < list_of_purchases.size(); i++)
            {
                Color color;
                if (i % 2 == 0)
                    color = Color.FromName("ControlLight");
                else
                    color = Color.FromName("AppWorkspace");
 
                Purchase_Panel purchase = new Purchase_Panel(list_of_purchases[i], color, list_of_purchases.update, list_of_purchases_drawing);
                purchase.add_panel(panel1);
            }
        }
 
        public void list_of_stocks_drawing()
        {
            panel1.Controls.Clear();
 
            for (int i = 0; i < list_of_stocks.size(); i++)
            {
                Color color;
                if (i % 2 == 0)
                    color = Color.FromName("ControlLight");
                else
                    color = Color.FromName("AppWorkspace");
 
                Purchase_Panel purchase = new Purchase_Panel(list_of_stocks[i], color, list_of_stocks.update, list_of_stocks_drawing);
                purchase.add_panel(panel1);
            }
        }
 
        public void list_of_sales_drawing()
        {
            panel1.Controls.Clear();
 
            for (int i = 0; i < list_of_sales.size(); i++)
            {
                Color color;
                if (i % 2 == 0)
                    color = Color.FromName("ControlLight");
                else
                    color = Color.FromName("AppWorkspace");
 
                Sale_Panel sale = new Sale_Panel(list_of_sales[i], color, list_of_sales.update, list_of_sales_drawing);
                sale.add_panel(panel1);
            }
        }
Как вы видите, разница заключается лишь в типе списка, по которому мы идем в цикле и в типе панели, которая создается через new().

Вот шаблонная функция, которая у меня получилась:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                public void list_drawing<L, P>(APanel_List<L> list, APanel<P> panel)
        {
            panel1.Controls.Clear();
 
            for (int i = 0; i < list.size(); i++)
            {
                Color color;
                if (i % 2 == 0)
                    color = Color.FromName("ControlLight");
                else
                    color = Color.FromName("AppWorkspace");
                
                APanel<P> new_panel = ????????????
                new_panel.add_panel(panel1);
            }
        }
Вместо знаков вопроса по-идее должно быть что-то типа new L(list[i], color, list.update, list_drawing<L, P>), но компилятор так сделать естественно не позволяет. Прошу вас помочь мне разобраться в этой проблеме. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.07.2020, 01:54
Ответы с готовыми решениями:

Создать шаблонную функцию
Создать шаблонную функцию. Алгоритм придумываете сами. Помогите пожалуйста!

Создать шаблонную функцию для генерации рандомных чисел
Есть код, который заполняет вектор случайными значениями типа int. Можно ли сделать шаблон для функции random_number, чтобы она...

Создать шаблонную функцию вычисляющую произведение двух чисел
Создать шаблонную функцию которая принимает два параметра одинакового типа и как рузультаты возвращает произведение этих чисел. Перегрузить...

4
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
14.07.2020, 07:26
Цитата Сообщение от nranes Посмотреть сообщение
Прошу вас помочь
1. Что собой представляют списки list_of_purchases, list_of_stocks и list_of_sales? В чём их отличие (покажите описание классов).
2. Что делает метод update?
0
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39
19.07.2020, 00:25  [ТС]
Цитата Сообщение от ashsvis Посмотреть сообщение
1. Что собой представляют списки list_of_purchases, list_of_stocks и list_of_sales? В чём их отличие (покажите описание классов).
2. Что делает метод update?
Абстрактный класс APanel_List
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
public abstract class APanel_List<T> where T : AOperation
    {
        protected List<T> panels_list = new List<T>();
        protected Functions functions = new Functions();
        virtual protected string query { get; set; } = "SELECT * FROM purchases";
 
        public void add(T item)
        {
            panels_list.Add(item);
        }
 
        public int size()
        {
            return panels_list.Count();
        }
 
        virtual public T this[int index]
        {
            get
            {
                return panels_list[index];
            }
        }
 
        abstract public void drawing(Panel panel);
 
        abstract protected void new_panel(int purchase_id, bool sold, int user_id,
                                          string game, string description,
                                          string funpay_link, double price, DateTime date_time);
        abstract public void update();
    }
Purchases_List
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
44
45
46
47
48
49
50
51
52
53
54
public class Purchases_List : APanel_List<Purchase>
    {
        public override void drawing(Panel panel)
        {
            panel.Controls.Clear();
 
            for (int i = 0; i < size(); i++)
            {
                Color color;
                if (i % 2 == 0)
                    color = Color.FromName("ControlLight");
                else
                    color = Color.FromName("AppWorkspace");
 
                Purchase_Panel sale = new Purchase_Panel(panels_list[i], color);
                sale.add_panel(panel);
            }
        }
 
        protected override void new_panel(int purchase_id, bool sold, int user_id,
                           string game, string description,
                           string funpay_link, double price, DateTime date_time)
        {
            add(new Purchase(purchase_id, price, game, description, funpay_link, date_time, user_id, sold));
        }
 
        public override void update()
        {
            panels_list.Clear();
 
            DataTable purchases = functions.create_datatable(query);
 
            for (int index = 0; index < purchases.Rows.Count; index++)
            {
                int purchase_id;
                bool sold;
                int user_id;
                string game, description, funpay_link;
                double price;
                DateTime date_time;
 
                purchase_id = Convert.ToInt32(purchases.Rows[index].ItemArray[0]);
                price = Convert.ToDouble(purchases.Rows[index].ItemArray[1]);
                game = purchases.Rows[index].ItemArray[2].ToString();
                description = purchases.Rows[index].ItemArray[3].ToString();
                funpay_link = purchases.Rows[index].ItemArray[4].ToString();
                date_time = Convert.ToDateTime(purchases.Rows[index].ItemArray[5]);
                user_id = Convert.ToInt32(purchases.Rows[index].ItemArray[6]);
                sold = Convert.ToBoolean(purchases.Rows[index].ItemArray[7]);
 
                new_panel(purchase_id, sold, user_id, game, description, funpay_link, price, date_time);
            }
        }
    }
Stocks_List
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
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Stocks_List : APanel_List<Purchase>
    {
        protected override string query { get; set; } = "SELECT * FROM purchases WHERE sold = \'False\'";
 
        public override void drawing(Panel panel)
        {
            panel.Controls.Clear();
 
            for (int i = 0; i < size(); i++)
            {
                Color color;
                if (i % 2 == 0)
                    color = Color.FromName("ControlLight");
                else
                    color = Color.FromName("AppWorkspace");
 
                Purchase_Panel sale = new Purchase_Panel(panels_list[i], color);
                sale.add_panel(panel);
            }
        }
 
        protected override void new_panel(int purchase_id, bool sold, int user_id,
                           string game, string description,
                           string funpay_link, double price, DateTime date_time)
        {
            add(new Purchase(purchase_id, price, game, description, funpay_link, date_time, user_id, sold));
        }
 
        public override void update()
        {
            panels_list.Clear();
 
            DataTable purchases = functions.create_datatable(query);
 
            for (int index = 0; index < purchases.Rows.Count; index++)
            {
                int purchase_id;
                bool sold;
                int user_id;
                string game, description, funpay_link;
                double price;
                DateTime date_time;
 
                purchase_id = Convert.ToInt32(purchases.Rows[index].ItemArray[0]);
                price = Convert.ToDouble(purchases.Rows[index].ItemArray[1]);
                game = purchases.Rows[index].ItemArray[2].ToString();
                description = purchases.Rows[index].ItemArray[3].ToString();
                funpay_link = purchases.Rows[index].ItemArray[4].ToString();
                date_time = Convert.ToDateTime(purchases.Rows[index].ItemArray[5]);
                user_id = Convert.ToInt32(purchases.Rows[index].ItemArray[6]);
                sold = Convert.ToBoolean(purchases.Rows[index].ItemArray[7]);
 
                new_panel(purchase_id, sold, user_id, game, description, funpay_link, price, date_time);
            }
        }
    }
Sales_List
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class Sales_List : APanel_List<Sale>
    {
        public override void drawing(Panel panel)
        {
            panel.Controls.Clear();
 
            for (int i = 0; i < size(); i++)
            {
                Color color;
                if (i % 2 == 0)
                    color = Color.FromName("ControlLight");
                else
                    color = Color.FromName("AppWorkspace");
 
                Sale_Panel sale = new Sale_Panel(panels_list[i], color);
                sale.add_panel(panel);
            }
        }
 
        protected override void new_panel(int purchase_id, bool sold, int user_id,
                                          string game, string description,
                                          string funpay_link, double price, DateTime date_time)
        { }
 
        public override void update()
        {
            panels_list.Clear();
 
            string query = "SELECT * FROM sales";
 
            DataTable sales = functions.create_datatable(query);
 
            for (int index = 0; index < sales.Rows.Count; index++)
            {
                //Поля для новой продажи
                int sale_id = Convert.ToInt32(sales.Rows[index].ItemArray[0]);
                int purchase_id = Convert.ToInt32(sales.Rows[index].ItemArray[1]);
                double sell_price = Convert.ToDouble(sales.Rows[index].ItemArray[2]);
                string buyer_discord = sales.Rows[index].ItemArray[3].ToString();
                string paypal_operation_id = sales.Rows[index].ItemArray[4].ToString();
                DateTime sale_date_time = Convert.ToDateTime(sales.Rows[index].ItemArray[5]);
 
                query = "SELECT * FROM purchases WHERE id = " + purchase_id;
                DataTable purchase_table = functions.create_datatable(query);
 
                //Поля для покупки, на которой будет основана продажа
                double purchase_price = Convert.ToInt32(purchase_table.Rows[0].ItemArray[1]);
                string purchase_game = purchase_table.Rows[0].ItemArray[2].ToString();
                string purchase_description = purchase_table.Rows[0].ItemArray[3].ToString();
                string purchase_funpay_link = purchase_table.Rows[0].ItemArray[4].ToString();
                DateTime purchase_date_time = Convert.ToDateTime(purchase_table.Rows[0].ItemArray[5]);
                int purchase_user_id = Convert.ToInt32(purchase_table.Rows[0].ItemArray[6]);
 
                Purchase purchase = new Purchase(purchase_id, purchase_price, purchase_game, purchase_description,
                                                 purchase_funpay_link, purchase_date_time, purchase_user_id, true);
 
                add(new Sale(sale_id, purchase, sell_price, buyer_discord, paypal_operation_id, sale_date_time));
            }
        }
    }
Добавлено через 1 минуту
Как бы я не пытался, в моем варианте реализации сделать единый шаблонный метод не получилось
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
19.07.2020, 09:23
Лучший ответ Сообщение было отмечено nranes как решение

Решение

«И предал я сердце мое тому,
чтобы познать мудрость
и познать безумие и глупость;
Узнал, что и это — томление духа.
Потому что во многой мудрости много печали;
И кто умножает познания, умножает скорбь» (c)
Я к тому, что уточнение реализации пользы мне не принесло. Для оптимизации структуры кода
необходимо понимать, что тот код делает.
Смущает то, что для каждого элемента списка создаётся своя панель для обработки соответствующего элемента
типа.
Однако и сами типы наследуют от одного предка. Здесь же пытаемся применить шаблон, хотя есть возможность
использовать методы наследования для реализации особенностей разных потомков класса...
1
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39
19.07.2020, 19:08  [ТС]
Лучший ответ Сообщение было отмечено ashsvis как решение

Решение

Я не совсем понимаю какие выводы я должен сделать из вашего сообщения. Вы имеете в виду, что шаблонный метод здесь вообще не нужен и вполне можно обойтись тем, что есть? То есть у каждого класса будет свой собственный переопределенный метод update? На данный момент я так и сделал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.07.2020, 19:08
Помогаю со студенческими работами здесь

а) Создать шаблонную функцию, изменяющую попарно элементы массива следующим образом
а) Создать шаблонную функцию, изменяющую попарно элементы массива следующим образом: первый элемент будет равняться сумме ...

Создать шаблонную функцию с двумя параметрами одинакового типа,которая будет менять местами их значения
Пожалуйста помогти с задачей,все сделал кроме этой задачи.Это должна быть програма в с++. Очень важно. С меня + репутация. Пожалуйста!!!

Не могу придумать функцию для удаления повторяющихся элементов?
Вот мой код, для него как то нужно написать функцию удаления повторяющихся элементов public class List { private Node head; ...

Как построить шаблонную функцию?
Добрый вечер! Есть код, который всегда повторяется в дочерних классах: QPushButton *button = new QPushButton(QIcon(&quot;:/icons/&quot;...

Как реализовать шаблонную функцию?
Добрый день Хочу реализовать одну функцию получающую значение типа int Есть два варианта получения значения, один при чтении из файла,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru