Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 3
1

Универсальный метод ввода для данных разных объектов

11.01.2018, 22:23. Показов 1136. Ответов 7
Метки нет (Все метки)

Есть программа, в которой в одном классе существуют интерфейс, родительский класс, который наследует интерфейс и 4 дочерних класса, где помимо основных данных с родительского класса есть уникальные данные. Возможно ли создать универсальный метод, который принимает данные в зависимости от того, объект какого класса инициализирован?

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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2018, 22:23
Ответы с готовыми решениями:

Универсальный метод для разных входных параметрах
Здравствуйте! Есть такой код, я уже частично его приводил using System; using...

Универсальный метод, как сделать фабрику объектов?
собственно сначала код public interface IMyClass { } ...

Есть ли универсальный метод получения значения объектов на форме?
Здравствуйте. Озадачился вопросом считывания значений всех элементов формы. Нашел вот такой...

Можно ли создать для них один универсальный метод, чтобы не зависело от типа данных?
Всем доброго времени суток! Подскажите одну вещь: я создаю два метода, которые одинаковые, но...

7
34 / 34 / 20
Регистрация: 11.08.2012
Сообщений: 140
11.01.2018, 22:40 2
Можно использовать операцию is, например
C#
1
2
3
4
5
6
7
8
9
if(ОбъектБазовогоКласса is ДочернийТип1)
{
   //Действия...
}
 
if(ОбъектБазовогоКласса is ДочернийТип2)
{
   //Другие действия...
}
Разумеется, в каждой ветви нужно привести ОбъектБазовогоКласса к соответствующему типу.
0
2902 / 2060 / 1029
Регистрация: 14.08.2016
Сообщений: 7,101
11.01.2018, 23:09 3
Цитата Сообщение от alexey_zaburetz Посмотреть сообщение
Костыльная версия со свичкейсом ну слишком уж громоздкая
выкладывай, для предметного разговора...
0
34 / 34 / 20
Регистрация: 11.08.2012
Сообщений: 140
11.01.2018, 23:13 4
Пардон. Поторопился. Если вопрос в принимаемых параметрах...
В базовом классе можно создать метод с модификатором virtual с переменным количеством параметров типа object

C#
1
2
3
4
public virtual void Method(params[] object params)
{
    //...
}
А в дочерних классах переопределить метод по-своему.

Тогда при вызове этого метода будет вызван метод именно того типа, к которому принадлежит объект...
0
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 3
11.01.2018, 23:24  [ТС] 5
Все свичкейсы психанул и удалил уже. Если говорить об основном коде, то вот это, собственно, класс:

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public class Library
    {
        interface IBook
        {
            string Author { get; set; }
            string Name { get; set; }
            int Pages { set; get; }
            bool Avaliable { set; get; }
        }
        public class Book : IBook
        {
            private string name, author;
            private int pages;
            public string Name
            {
                //...//
                set;get;
            }
            public string Author
            {
                //...//
                set;get;
            }
 
            public int Pages
            {
                //...//
                set;get;
            }
            public bool Avaliable { set; get; }
        }
        public class Ancient : Book
        {
            private int year;
            private int saved;
            
           
            private string material;
            public int Saved
            {
                //...//
                set;get;
            }
 
            public int Year
            {
                //...//
                set;get;
            }
            public string Material
            {
               //...//
                set;get;
            }
        }
        public class Medieval : Book
        {
            private int year;
            public string Executed;
            public string Execution(string s)
            {
                //...//
            }
            public int Year
            {
               //...//
                set;get;
            }
 
        }
        public class New : Book
        {
            private int year;
            public int Year
            {
                //...//
                set;get;
            }
        }
        public class Modern : Book
        {
            private int year;
            private float reviewstars;
            public string Publisher;
            public float ReviewStars
            {
                //...//
                set;get;
            }
            public int Year
            {
                //...//
                set;get;
            }
        }
 
 
    }
Как я понял, нужно создать статический объект

C#
1
 public static object  obj = new Library();
И далее переназначать его в соответствии с условиями (в моем случае это комбо-бокс)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string s = comboBox1.Text;
                switch (s)
                {
                    case "Ancient":
                        obj = new Library.Ancient(); 
                        break;
                    case "Medieval":
                        obj = new Library.Medieval();
                        break;
                    case "Modern":
                        obj = new Library.Modern();
 
                        break;
                    case "New":
                        obj = new Library.New();
 
                        break;
                    default:
                        break;
                }
Потом нужно посылать этот объект в другую форму, но я не совсем понимаю как это делать. (Извиняюсь за длинно-пост)
0
2902 / 2060 / 1029
Регистрация: 14.08.2016
Сообщений: 7,101
12.01.2018, 00:48 6
понятней не стало, мешанина какая-то... изначальное задание/задумка какая?
0
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 3
12.01.2018, 01:01  [ТС] 7
Нужно создать программу для учета и добавления книг в виртуальную библиотеку. Должна представлять приложение с формами. По задумке изначально открывается форма с учетом книг, где по соответствующим категориям из соответствующего файла вытаскиваются все данные. При нажатии кнопки "Добавить" должна открываться форма соответствующей категории. Изначально было 4 отдельные формы, потому что не оставалось времени уже (задание в универ), но преподаватель приказал допилить. Новая задумка - вторая форма одна-единственная с изменяющимися параметрами в соответствии с тем, какой объект инициализирован комбобоксом(те самые категории) и ввод данных нужно организовать по-божески.
0
1135 / 353 / 110
Регистрация: 09.01.2018
Сообщений: 722
12.01.2018, 02:22 8
С одной фомой больше мороки. Свич в главной форме, свич во второй форме. Да еще и элементы формы должны изменяться в зависимости от переданного параметра.
Проще создать одну базовую форму BookCreate и наследоваться от нее. На кнопку Create каждой наследуемой формы повесить свое событие (какую именно книгу создавать).
А в главной форме по кейсам вызывать нужные формы создания книг.

Главная форма:

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
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //GetAllBooks
        }
     
        //AddBook Button
        private void button1_Click(object sender, EventArgs e)
        {
            int index = comboBox1.SelectedIndex;
 
            switch (index)
            {
                case 0:
                    new FormModernBookCreate().Show();
                    break;
                default:
                    MessageBox.Show("This form is not exists yet");
                    break;
            }
        }
    }
Базовая форма BookCreate:

C#
1
2
3
4
5
6
7
8
9
 public partial class FormBookCreate : Form
    {
        public FormBookCreate()
        {
            InitializeComponent();
        }
        
        //содержит базовые для всех форм поля
    }
Наследуемая форма

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class FormModernBookCreate : FormBookCreate
    {
        public FormModernBookCreate()
        {
            InitializeComponent();
        }
 
        //содержит дополнительные поля Year, Publisher и кнопку Create
       
        //Create Modern Book Button
        private void button1_Click(object sender, EventArgs e)
        {
            //Create ModernBook 
        }
    }
Код дизайнера форм приводить не буду, там ровно то, что написано в коменнтариях, парочка полей, парочка лейблов.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2018, 02:22

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как создать список для объектов разных типов данных
Здравствуйте, подскажите, пожалуйста, у меня есть задание: Создать базовый класс «Транспорт» и...

Для разработанного класса объектов разработать asp-страницы для ввода данных объекта и передачу на сервер
Для разработанного класса объектов(класс был создан раннее). Нужно разработать asp-страницы для...

Универсальный метод извлечения данных из БД
Есть ли какой-нибудь способ через dataadapter сделать универсальный метод для извлечения данных в...

Универсальный интерфейс для ввода
Написать библиотеку, с помощью которой можно легко организовать интерфейс через командную строку...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.