Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85

Как заполнить List<MyClass> случайным количеством классов наследников?

29.05.2018, 13:27. Показов 4764. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Что-то никак не могу сделать следующее: Есть абстрактный класс Room и классы наследники Kitchen, Bedroom, Hall, Restroom, Storeroom. Как заполнить List<Room> случайным количеством классов наследников?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.05.2018, 13:27
Ответы с готовыми решениями:

Перебрать List<MyClass> со вложенными списками List<MyClass> в каждом элементе
Есть древовидная структура вида: List&lt;MyClass&gt; myClassList; //... public class MyClass{ public List&lt;MyClass&gt;...

Как изменить свойство элемента в list? List<MyClass>
В list содержится класс MyClass у которого есть свойства, как изменить у элемента в list требуемое свойство? Например: class...

Создать и заполнить одномерный массив случайным количеством случайных элементов
функция должна создавать и заполнять одномерный массив случайным количеством случайных элементов. Размер массива в диапазоне от 10 до 100...

9
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
29.05.2018, 13:38
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication10
{
    abstract class Room 
    {
        abstract public void Print();
    }
    class Kitchen : Room { override public void Print() { Console.WriteLine("Kitchen"); } }
    class Bedroom : Room { override public void Print() { Console.WriteLine("Bedroom"); } }
    class Hall : Room { override public void Print() { Console.WriteLine("Hall"); } }
    class Restroom : Room { override public void Print() { Console.WriteLine("Restroom"); } }
    class Storeroom : Room { override public void Print() { Console.WriteLine("Storeroom"); } }
 
 
    class Program
    {
        static void Main()
        {
            Random rnd = new Random();
            List<Room> rooms = new List<Room>();
            for (int i = 0; i < rnd.Next(100); i++)
            {
                switch (rnd.Next(5))
                {
                    case 0:
                        rooms.Add(new Kitchen());
                        break;
                    case 1:
                        rooms.Add(new Bedroom());
                        break;
                    case 2:
                        rooms.Add(new Hall());
                        break;
                    case 3:
                        rooms.Add(new Restroom());
                        break;
                    case 4:
                        rooms.Add(new Storeroom());
                        break;
                }
            }
            foreach (Room room in rooms)
                room.Print();
        }
    }
}
1
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
29.05.2018, 14:18  [ТС]
Спасибо, примерно тоже самое сделал у себя, но я скорее не раскрыл вопрос, есть ли способ не использовать явное добавление наследников. Тоесть не проходить через switch case, а сделать это динамически, что бы как только создавался новый наследник базвого класса он был бы в пуле на добавление. К примеру у меня вариантов комнат будет 100, и они будут постоянно добавляться, как тогда, не менять же свитч кейс добаляя case 101+? На ум приходит сделть свойство с типом энума в классе ROOM в котором будет указанно имя наследника, ну и соответсвтенно сделать список из энумов и перебирать по классу наследнику через рефлексию, и создавать новый экземпляр, но это как то костыльно и избыточно, и опять же нужно добавлять в енум название класса, что практичекси сводит к тому же способу как и у вас, только более заковыристо реализованному.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
29.05.2018, 16:53
Цитата Сообщение от Alone11 Посмотреть сообщение
что бы как только создавался новый наследник базвого класса он был бы в пуле на добавление
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication10
{
    public delegate void RoomCreaitngEventHandler(object sender, EventArgs e);
    abstract class Room
    {
        public static event RoomCreaitngEventHandler RoomCreating;
        public Room()
        {
            if (RoomCreating != null)
                RoomCreating(this, new EventArgs());
        }
        abstract public void Print();
    }
 
    class Kitchen : Room { override public void Print() { Console.WriteLine("Kitchen"); } }
    class Bedroom : Room { override public void Print() { Console.WriteLine("Bedroom"); } }
    class Hall : Room { override public void Print() { Console.WriteLine("Hall"); } }
    class Restroom : Room { override public void Print() { Console.WriteLine("Restroom"); } }
    class Storeroom : Room { override public void Print() { Console.WriteLine("Storeroom"); } }
 
    class Program
    {
        static List<Room> rooms;
 
        static void Main()
        {
            Random rnd = new Random();
            rooms = new List<Room>();
            Room.RoomCreating += Room_RoomCreating;
            Kitchen k1 = new Kitchen();
            Bedroom b1 = new Bedroom();
            Hall h1 = new Hall();
            Bedroom b2 = new Bedroom();
            Hall h2 = new Hall();
            Hall h3 = new Hall();
            foreach (Room room in rooms)
                room.Print();
        }
 
        private static void Room_RoomCreating(object sender, EventArgs e)
        {
            rooms.Add((sender as Room));
        }
 
    }
}
1
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
29.05.2018, 17:19  [ТС]
Огромное спасибо, но опять немного не то, в первом случае явно указываем через Switch case, что добавляем в список экземпляр класса.(Соответственно мы для каждого класса наследника должны добавить свою case конструкцию.) Во втором мы при создании вручную экземпляра класса, тип которого явно нами указанн, сразу подписываем его на событие добавления в список.

Оба примера шикарны, и в первом случае действительно создается случайный экземпляр из возможных наследников, но как обойти конструкцию switch case ? Тоесть можно ли как то получить список всех возможных классов наследников от базового класса и создать случайное количество екземпляров случайно выбранных наследников?
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
29.05.2018, 17:58
Лучший ответ Сообщение было отмечено Alone11 как решение

Решение

Alone11,
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
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;
 
namespace ConsoleApplication10
{
    abstract class Room { abstract public void Print(); }
 
    class Kitchen : Room { override public void Print() { Console.WriteLine("Kitchen"); } }
    class Bedroom : Room { override public void Print() { Console.WriteLine("Bedroom"); } }
    class Hall : Room { override public void Print() { Console.WriteLine("Hall"); } }
    class Restroom : Room { override public void Print() { Console.WriteLine("Restroom"); } }
    class Storeroom : Room { override public void Print() { Console.WriteLine("Storeroom"); } }
 
    class Program
    {
        static List<Room> rooms;
 
        static void Main()
        {
            Random rnd = new Random();
            rooms = new List<Room>();
            Type ourtype = typeof(Room);
            Type[] types = Assembly.GetAssembly(ourtype).GetTypes().Where(type => type.IsSubclassOf(ourtype)).ToArray();
            for (int i = 0; i < rnd.Next(100); i++)
            {
                Room room = (Room)Activator.CreateInstance(types[rnd.Next(types.Length)]);
                rooms.Add(room);
            }
            foreach (Room room in rooms)
                room.Print();
        }
 
    }
}
1
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
29.05.2018, 18:08  [ТС]
Даценд, Спасибо!
0
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
20.06.2018, 19:37  [ТС]
Даценд, Хотел бы немного апнуть тему, подскажите, а как быть если у класса наследника конструктор без параметров отсутствует?

К примеру перепишем код класса Hall : Room
C#
1
2
3
4
5
6
7
8
9
 public enum SomeEnum {one=1,two }
 class Hall : Room {
        SomeEnum CountIteration { get;  set; }
        public Hall(SomeEnum countIteration)
        {
            CountIteration = countIteration;
        }
        override public void Print() { Console.WriteLine("Hall"); }
        public void SomeMet() { Console.WriteLine($"Что-то  делать {CountIteration} раза"); }
0
29 / 31 / 27
Регистрация: 15.11.2017
Сообщений: 121
20.06.2018, 19:41
Цитата Сообщение от Alone11 Посмотреть сообщение
как быть если у класса наследника конструктор без параметров отсутствует?
создать его
0
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
21.06.2018, 16:38  [ТС]
VIAZNIKOVGM,
Это конечно хорошо, но вот спецкласс должен создаваться только на основании определенного параметра, соответственно я не могу сделать просто конструктор без параметров. В тоже самое время, мне нужно получить список заполненый екземплярами классов наследников базового класса, в который попадает и класс который создается только с праметрами. Как быть?

Добавлено через 7 часов 50 минут
Update:
Кое в чем разобрался, достаточно указать значение параметра после запятой и все норм, но так как мы не знаем какой класс сгенерируется в списке, и будет ли он содержать конструктор по умолчанию, пытаюсь задействовать рефлексию, получив тип елемента из списка классов наследников и, сравнив его с нужным, выполнить его инициализацию с параметром, но не получается узнать тип элемента массива. (В принципе, можно и капнуть до параметра конструктора требуемого типа и узнать если он SomeEnum то выполнить инициализацию с параметром, но опять таже проблема, не GetElementType() не дает тип элемента.)
Прошу помощи.

C#
1
2
3
4
5
6
7
8
9
10
                SomeEnum e = SomeEnum.two
                for (int i = 0; i < rnd.Next(100); i++)
            {
                 int element = rnd.Next(types.Length);
                 Room room ;
                 if (types[element].GetType().GetElementType() == typeof(Hall)) \\ вот тут почему то не срабатывает, не могу получить тип элемента в массиве, все время получаю тип самого массива.
                {room = (Room)Activator.CreateInstance(types[element],e); }
                else { room = (Room)Activator.CreateInstance(types[element]); }
                rooms.Add(room);
             }
Добавлено через 12 часов 52 минуты
Update: разобрался.
строку
C#
1
if (types[element].GetType().GetElementType() == typeof(Hall)
заменить на

C#
1
if (types[element] == typeof(Hall)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.06.2018, 16:38
Помогаю со студенческими работами здесь

Как отобразить List<MyClass> в Asp.Net
Доброе время суток всем помогите пожалуста в Asp.net не бум бум заранее всем Спасибо Для прима есть класс public class Answer...

Как добавить в List<MyClass> данные типа Class
Язык программирования C#! Всем добрый день! Есть такая проблема связанная со свойством типа List&lt;свой тип&gt; итак её суть! Создал...

Универсальное преобразование List<object> -> List<MyClass>
Пытаюсь написать нечто универсальное для преобразования сущностей из БД (таблицы) в сущности C# (классы). /// &lt;summary&gt; ...

Как использовать наследников от стандартных классов? Например, CMyEdit?
Я начал изучать MFC. Программа - простой диалог со строкой ввода. Диалог со строкой ввода нарисовал как ресурс. Мне нужно в clipboard...

Преобразование List<MyClass> to List<Object>
собственно ловлю ошибку при преобразовании списка состоящего из экземпляров моего класса в List&lt;Object&gt; пытаюсь сделать такое ...


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

Или воспользуйтесь поиском по форуму:
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 , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru