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

Создание экземпляра заранее не известного класса

11.10.2020, 02:39. Показов 2546. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, столкнулся с проблемой, помогите пожалуйста.

Есть класс Weapon и наследуемые от него Sword, Bow, Axe ...
Нужно создать новый экземпляр одного из наследников. Но заранее не известно какого.
Узнаю какой именно класс нужно создать получая его имя.

Выглядит это примерно так
C#
1
2
3
4
5
public void SetWeapon(String typeName)
    {
        Type type = Type.GetType(typeName);
        //Далее нужно создать новый экземпляр класса этого типа
    }
Если делаю всё вообще не правильно, быть может, намекнёте в каком направлении хотя бы двигаться.
Через switch думал проработать все варианты просто по названию, но такой подход кажется мне не верным.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2020, 02:39
Ответы с готовыми решениями:

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); Вопрос: BC - это экземпляр класса BaseClass...

Создание экземпляра класса
Народ, можете пожалуйста доходчиво объяснить в чем разница. есть, например, класс class MyClass { public...

Создание экземпляра класса
Как написать класс class Class1 Class1(int x1,int x2) { ........ } так чтобы при вызове

8
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
11.10.2020, 09:08
Надо создавать рандомно?
Тогда switch. Если фабричный метод задействован, то

C#
1
2
Weapon _axe = new Axe();
Weapon _sword = new Sword();
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,216
11.10.2020, 09:21
Лучший ответ Сообщение было отмечено Anma как решение

Решение

Anma, в данной задаче надо учитывать 2 фактора:
1) ссылка, через которую будете работать с этим классом - будет базовая (Weapon)
2) список конструкторов класса-наследника
Если взять самый просто вариант (базовый конструктор по умолчанию), то
C#
1
2
        Type type = Type.GetType(typeName);
        Weapon weapon = Activator.CreateInstance(type) as Weapon;
Остальное зависит от конкретной задачи.
1
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
11.10.2020, 09:42
Enifan, а его потом даункастить можно будет?
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,216
11.10.2020, 09:56
Цитата Сообщение от Blasphemie Посмотреть сообщение
даункастить
Не встречал раньше данного термина. Что он означает ? (гугл неразговорчив)
0
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
11.10.2020, 10:10
Enifan, это действие, противоположное апкасту.
(Попытка, иногда успешная) приведения переменной к классу-потомку.

Добавлено через 4 минуты
Вот что я имею в виду:

C#
1
2
3
            object xtr = new string("ststststst");
            xtr.Remove(0, 2); //даже не скомпилируется
            ((string)xtr).Remove(0, 2); // работает
1
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,216
11.10.2020, 10:22
Лучший ответ Сообщение было отмечено Anma как решение

Решение

Blasphemie, ссылка у нас базовая (Weapon), а объект - тот что хотели (Sword или Bow). Классический полиморфизм. Возможно ли сделать и ссылку как и объекта - нет, но при правильной иерархии нам и не надо, ведь полиморфизм для того и придумали.
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
using System;
 
abstract class Weapon{
    public abstract void Foo();
}
class Sword : Weapon {
    public override void Foo() => Console.WriteLine("Удар мечом");
}
class Bow : Weapon{
    public override void Foo() => Console.WriteLine("Стрельба из лука");
}
 
class Program
{
    static void Main()
    {
        Bow bow = new Bow();
        SetWeapon(bow.ToString());
 
        Console.ReadKey();
    }
 
    static void SetWeapon(String typeName)
    {
        Type type = Type.GetType(typeName);
        Weapon weapon = Activator.CreateInstance(type) as Weapon;
        weapon.Foo();
    }
}
Сокращенно это можно представить так
C#
1
2
        Weapon weapon = new Bow();
        weapon.Foo();
Добавлено через 2 минуты
Цитата Сообщение от Blasphemie Посмотреть сообщение
Вот что я имею в виду
Все верно. тип object не знает таких методов, как Remove
Но, у нас есть базовый класс с virtual-методами. Вот через них и будем работать
2
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
11.10.2020, 10:40
Цитата Сообщение от Enifan Посмотреть сообщение
Сокращенно это можно представить так
Я именно с этим вопросом первый раз на этот форум пришел, о потоковом даункасте.

Теперь я знаю как правильно, но иногда по привычке таки даункастом пользуюсь. Я собака, мне можно.
0
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 3
11.10.2020, 14:37  [ТС]
Спасибо огромное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2020, 14:37
Помогаю со студенческими работами здесь

Создание нового экземпляра класса, который не известен заранее
Привет! Есть окно добавления нового сотрудника в структуру организации. Сотрудники разделены классами. Вопрос: Как создать экземпляр...

Создание заранее не известного Control одного типажа
Начну из далека - есть некоторый файл, который парсится. В случае если в нем найдена одна метка то должен создастся компонент RadioButton,...

Создание экземпляра класса
Здравствуйте, форумчане. Требуется Ваша помощь, если кто-то найдет минутку, буду очень благодарен. Ситуация следующая- мной в консольном...

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

Создание экземпляра класса, разрушение экземпляра класса
Не могу найти информацию про разрущение экземпляра класса. Объясните пожалуйста, что это?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru