Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
1

Типизированный базовый класс

18.08.2019, 07:52. Показов 2740. Ответов 4

Author24 — интернет-сервис помощи студентам
Всем добра. Пишу для себя одну программку, и немного забуксовал в одном моменте. Раньше особо с типизированными классами работать особо не приходилось, вот и туплю. В чём суть:

1. Есть базовый класс информации, допустим (пишу всё для примера):
C#
1
2
3
4
public class baseInfo
{
    public int aaa { get; set; }
}
2. Есть базовый типизированный класс с данными:
C#
1
2
3
4
5
public class baseVariables<T>
{
    public int aaa { get; set; }
    public T[] bbb {get; set;}
}
По умолчанию, в виде класса T, передаётся baseInfo.
3. Есть несколько методов, которые принимают в качестве аргумента baseVariables<baseInfo>, которые выполняют операции над данными в них, и записывают результаты обратно. Используются в них только данные из базовых классов. Типа так:
C#
1
2
3
4
public void calculate(baseVariables<baseInfo> info)
{
    info.aaa = info.bbb.Length;
}
4. Есть некоторое количество классов, основанных на базовых. Для каждого из них существуют свои реализации, на основе базового класса, например:
C#
1
2
3
4
5
6
7
8
9
public class mainInfo : baseInfo
{
    public int ddd { get; set; }
}
 
public class mainVariables : baseVariables<mainInfo>
{
    public int vvv { get; set; }
}
Собственно, проблема в чём - пока у меня не было типизации, я просто передавал условный mainVariables в условный calculate и всё было ок. После добавления типизации, такой вариант уже не катит. Можно было бы переписать метод calculate, чтобы он возвращал вычисленные значения, и метод обёртку для каждого из дочерних классов, которые бы подставляли их, но calculate возвращает 5-6 разных параметров.
Я возможно сейчас адски туплю, но адекватного и красивого решения я не вижу.

Добавлено через 1 час 12 минут
Уфф... Всё, до меня дошло где я накосячил. Если кому-нибудь будет нужно, то вот решение:
C#
1
2
3
4
5
public void calculate<T>(baseVariables<T> info)
{
    var bInf = info.bbb as baseInfo;
    info.aaa = bInf.Length;
}
Т.е. создаём нетипизированный метод, внутри которого приводим дочерний класс к базовому.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.08.2019, 07:52
Ответы с готовыми решениями:

Разработать базовый класс "прямоугольник", производный класс "Окно" и класс-контейнер "Список окон"
Реализовать все задачи в С # WPF 1. Разработать класс прямоугольник, имеющий координаты верхнего...

Описать базовый класс колоды карт и производный класс пасьянс
Здраствуйте! товарищи-программисты, помогите пожалуйста со следующим заданием: Создать колоду...

Класс: Дописать производный класс, дополняющий базовый и содержащий минимум 2 функции-члена...
Составьте программу на языке С#, которая должна содержать: 1) базовый класс в соответствии с...

Создать базовый класс прямоугольник и класс-наследник квадрат
Создать базовый класс прямоугольник со свойствами ширина, длина, конструктором с параметрами и...

4
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
18.08.2019, 10:54 2
Лучший ответ Сообщение было отмечено Захарка как решение

Решение

Захарка, У вас тогда теряется вся суть обобщенных методов. Вы с тем же успехом могли object в calculate передавать.
Сделайте так:
C#
1
2
3
4
5
public class baseVariables<T> where T : baseInfo
{
    public int aaa { get; set; }
    public T[] bbb {get; set;}
}
И тогда на уровне компиляции будет известно, что у элементов массива bbb есть свойства класса baseInfo
1
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
18.08.2019, 21:01  [ТС] 3
Toros1992, хм...
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
    public class baseInfo
    {
        public int aaa { get; set; }
    }
 
    public class baseVariables<T> where T : baseInfo
    {
        public int aaa { get; set; }
        public T[] bbb { get; set; }
    }
 
    public class mainInfo : baseInfo
    {
        public int ddd { get; set; }
    }
 
    public class mainVariables : baseVariables<mainInfo>
    {
        public int vvv { get; set; }
    }
 
//*****
 
        private void test()
        {
 
            mainVariables mw = new mainVariables()
            {
                aaa = 5,
                bbb = new mainInfo[] { new mainInfo { aaa = 5, ddd = 7 }, new mainInfo { aaa = 14, ddd = 25 } },
                vvv = 9
            };
 
            calculate(mw);
        }
 
        public void calculate(baseVariables<baseInfo> info)
        {
            info.aaa = info.bbb.Length;
        }
Пишет "Не удаётся преобразовать из mainVariables в baseVariables<baseInfo>".
0
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
18.08.2019, 23:30 4
Лучший ответ Сообщение было отмечено Захарка как решение

Решение

Так вы метод тоже обобщенным сделайте. А то ни то, ни сё.
C#
1
2
3
4
        public void calculate<T>(baseVariables<T> info) where T : baseInfo
        {
            info.aaa = info.bbb.Length;
        }
1
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
18.08.2019, 23:33  [ТС] 5
Toros1992, Спасибо большое.
0
18.08.2019, 23:33
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.08.2019, 23:33
Помогаю со студенческими работами здесь

Создать базовый класс
Создать базовый класс «Транспортное средство» и производные классы «Автомобиль», «Велосипед»,...

Описать базовый класс Строка и производную от Строка класс Десятичная_строка
Здравствуйте, уважаемые эксперты! Помогите, пожалуйста с заданием. Описать базовый класс...

Передача параметров в базовый класс
Подскажите как лучше реализовать передачу параметров из производного класса в базовый? Я...

Описать базовый класс Строка
Здравствуйте! Можете помочь написать программу : Описать базовый класс Строка. Обязательные поля...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как удалить файл из репозитория Git без его физического удаления
bytestream 26.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью удаления файлов из репозитория. Однако этот процесс может быть сложнее, чем кажется на первый взгляд,. . .
Как вынести изменения в коде в новую ветку (branch) в Git
bytestream 26.01.2025
Git представляет собой современную систему контроля версий, которая произвела революцию в процессе разработки программного обеспечения. Эта распределенная система позволяет программистам эффективно. . .
Всё не так уж и плохо.
Hrethgir 25.01.2025
Запустил более-менее сносно регистры в связке с сумматорами. Да - виновата оптимизация от Gowin EDA, дело в том, что Education шифрует нетлист, да и вообще много чего не позволяет. Просто обвязал. . .
Cisco ASA: подробное руководство по настройке и использованию
hw_wired 25.01.2025
В сетевой безопасности межсетевые экраны играют критически важную роль в защите корпоративных инфраструктур от постоянно растущего числа киберугроз. Среди множества решений для обеспечения. . .
Cisco Intelligent Services Gateway: руководство по настройке
hw_wired 25.01.2025
В сетевых инфраструктурах Cisco Intelligent Services Gateway (ISG) играет ключевую роль в организации и управлении сервисами для конечных пользователей. Этот компонент представляет собой. . .
Использование Go (Golang) в Highload-проектах: преимущества и особенности
bytestream 25.01.2025
В мире высоконагруженных систем выбор правильного инструментария играет ключевую роль в успехе проекта. Go (Golang) представляет собой относительно молодой язык программирования, который быстро. . .
Откуда у float лишние цифры в конце дробной части. Представление чисел с плавающей точкой
bytestream 25.01.2025
При разработке программного обеспечения часто возникает необходимость работать с вещественными числами, которые содержат дробную часть. В современных компьютерных системах такие числа представляются. . .
Как использовать глобальную переменную в функции в Python
bytestream 25.01.2025
В программировании на Python глобальные переменные представляют собой особый тип переменных, которые доступны для использования во всех частях программы, включая различные функции, классы и модули. . . .
Как в цикле обойти все элементы map в Java
bytestream 25.01.2025
В разработке на Java одной из наиболее востребованных структур данных является интерфейс Map, который предоставляет эффективный способ хранения и управления парами "ключ-значение". Разработчики. . .
Для чего нужен UserManager.isU­serAGoat(­) в Android и как это использовать
bytestream 25.01.2025
В мире Android-разработки существует множество интересных и порой загадочных функций, о которых знают далеко не все разработчики. Одной из таких функций является метод UserManager. isUserAGoat(),. . .
Как обойти массив в JavaScript. Всё о циклах
bytestream 25.01.2025
JavaScript представляет собой мощный язык программирования, широко используемый в веб-разработке, где массивы и циклы являются фундаментальными концепциями для эффективной работы с данными. Массив в. . .
Как сделать, чтобы существующая ветка отслеживала удалённую в Git. Связывание локальных и удалённых веток
bytestream 25.01.2025
В разработке программного обеспечения системы контроля версий стали неотъемлемой частью процесса создания качественного программного продукта. Эти инструменты позволяют разработчикам эффективно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru