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

Замена класса создаваемого объекта, в зависимости от параметров

29.09.2017, 17:02. Показов 6035. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Переезжаю в C# c PHP, и уперся в небольшую проблему. Мне нужно создавать объект разных классов, в зависимости от входных данных приложения. т.е. чтобы создаваемый объект мог инициализироваться разными классами (которые имеют одинаковое предназначение и реализуют один интерфейс). В PHP я просто создал бы переменную и подставлял разные имена классов. В шарпе в связи со строгой типизацией как грамотно сделать пока не пойму.
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
namespace Hunter
{
    internal class Process1 : SystemHub
    {
        private static string _mName;
        private static IList<DefaultPairs> _enabledPairs;
 
        public static void Main(string[] args)
        {
            var mApi = new MApi();   //  <<<<<<<<<<<<<<<< В этом месте мне нужно менять имя класса... но каК???
                            //               то есть объект остается с таким же именем но класс в зависимости от содержания args меняется
            using (var cmTh = CmThinking.OpenSession())
            {
                var systemSettings = cmTh.QueryOver<SystemSettings>().SingleOrDefault();
                if (!systemSettings.EnableTrader) throw new Exception("Трейдер отключен!");
                for (var i = 1; i <= _enabledPairs.Count; i++)
                {
                    try
                    {
                        var hunter = new Hunter();
                        hunter.RunHunter();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }
            }
        }
    }
}
так тоже не выходит, то что надо. нужно чтобы программа работала в нескольких режимах подключая разные классы, в зависимости от входных данных в Main

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public dynamic chooseM(string m)
        {
            if (m== "BTF")
            {
                var mApi = new BApi();
                return mApi;
            }
            else if (m == "BTR")
            {
                var mApi = new BApi();
                return mApi;
            }
            else
            {
                throw new Exception("Ошибка выбора");
            }
        }


Дальше мне нужно будет передавать этот объект в другие классы допустим, но как если тип (класс) может иметь по задумке несколько вариантов.. ??
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.09.2017, 17:02
Ответы с готовыми решениями:

Выбор типа переменной-члена класса в зависимости от параметров передаваемых конструктору
Здравствуйте форумчане! Ответьте пожалуйста на вопрос - возможно ли такое на С++ и если да, то как это реализовать? Имеется класс, в нём...

Изменить Porperty создаваемого объекта Xlglob
Хочу фоново создать документ - делаю Dim mass(0) Dim oRange,oRange1,oRange2,...

Ширина и высота динамически создаваемого объекта
Доброго времени суток! Такая ситуация: есть программа, в ходе работы которой создаются попеременно объекты типа: Tlabel и TImage. ...

6
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.09.2017, 17:07
Цитата Сообщение от GrafikRem Посмотреть сообщение
как грамотно сделать пока не пойму.
Самое простое - создать класс с методом фабрикой, который возвращает объект типа вашего интерфейса. А в реальности, на основе параметра будет возвращать создавать и возвращать объект нужного типа. Поскольку все они реализуют один и тот же интерфейс, это вполне легально с точки зрения компилятора.
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
29.09.2017, 17:14
Лучший ответ Сообщение было отмечено GrafikRem как решение

Решение

Как называется общий интерфейс и как называются два разных класса, скажи, я покажу пример..

Вообще это делается так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface ITester
{
    void Test();
}
public class TestA:ITester
{
 public void Test()
 { 
  Console.WriteLine("TestA");
 }
}
public class TestB:ITester
{
 public void Test()
 { 
 Console.WriteLine("TestB");
 }
}
А потом вот так делать:
C#
1
2
3
4
5
6
7
8
9
public ITester chooseM(string choose)
        {
            switch(choose)
            { 
               case "a": return new TestA(); break;
               case "b": return new TestB(); break;
               default: throw new Exception("Ошибка выбора");
            }
        }
а в коде использоваться так будет:
C#
1
2
3
4
5
6
7
8
9
10
11
public class Program
{
     public static void Main()
     { 
         ITester test = chooseM("a");
         test.Test();
         test = chooseM("b");
         test.Test();
         Console.ReadLine();
     }
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.09.2017, 17:16
Простой пример))
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication6 {
    class Program {
        static void Main(string[] args) {
            int objType = 2;
            IMovable obj = ObjectFactory.CreateObject(objType);
            obj.Move();
            Console.ReadLine();
        }
    }
    static class ObjectFactory {
        public static IMovable CreateObject(int arg) {
            IMovable obj = null;
            switch (arg) {
                case 0:
                    obj = new Automobile();
                    break;
                case 1:
                    obj = new Motorcycle();
                    break;
                case 2:
                    obj = new Horse();
                    break;
                default:
                    throw new ArgumentException();
            }
            return obj;
        }
    }
    class Automobile : IMovable {
        public void Move() {
            Console.WriteLine("Автомобиль едет");
        }
    }
    class Motorcycle : IMovable {
        public void Move() {
            Console.WriteLine("Мотоцикл едет");
        }
    }
    class Horse : IMovable {
        public void Move() {
            Console.WriteLine("Лошадь скачет");
        }
    }
    interface IMovable {
        void Move();
    }
}
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
29.09.2017, 17:17
insite2012, по сути, то же самое, что и я написал)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.09.2017, 17:18
Цитата Сообщение от 1231231ghacking Посмотреть сообщение
по сути, то же самое
100500.
Но думаю, так ТС будет более понятно, чем на абстрактном коне в вакууме.
0
 Аватар для GrafikRem
0 / 0 / 1
Регистрация: 28.11.2015
Сообщений: 53
29.09.2017, 19:17  [ТС]
всем большое спасибо!! разобрался.. все просто.. всем удачи..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.09.2017, 19:17
Помогаю со студенческими работами здесь

Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два
Здравствуйте. Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию из другого объекта\класса, в турбо...

Сократить объявление auto_ptr для вновь создаваемого объекта
Кстати, может кто подскажет... - в 3-й строке примера (std::autoptr...) можно как-то сократить запись, чтоб не повторять несколько раз new...

Через ComboBox задавать поля для создаваемого объекта
Хочу через комбобокс задавать поля для создаваемого объекта, пытался засунуть объект в комбобокс через &quot;источники данных&quot; но...

Непонятная ошибка при вызове функции от тут же создаваемого объекта
Ошибка появляется в строке 42: #include &quot;list.h&quot; #include &lt;iostream&gt; using namespace std; int menu() { ...

Можно ли выбрать класс создаваемого объекта во время выполнения программы?
привет. Появился вопрос. Есть базовый класс &quot;сечение&quot;. От него есть производные классы &quot;труба&quot;, &quot;двутавр&quot;,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru