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

Пример использования интерфейсов разными классами

01.02.2012, 17:06. Просмотров 24634. Ответов 43
Метки нет (Все метки)

скиньте сабж кому не трудно.или лучше ссылку на статью. весь гугль перерыл не нашел. Нашел только использование одним классом разных интерфейсов. даже на мсдн нету....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2012, 17:06
Ответы с готовыми решениями:

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

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

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

Библиотеки интерфейсов для использования с FASM
Приветствую! Люди, поделитесь знанием - какие DLL используете под ассемблер. В частности очень...

43
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
01.02.2012, 22:43  [ТС] 21
Да пожалуйста

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ЛР_10
{
    // тип перечисление "пол"
    enum Pol { неопределен, женский, мужской }
    enum Dolzhnost { неопределена, преподаватель, инженер }
    class sotrudnik
    {
        protected string fio;                // ФИО
        protected int[] data;               // дата рождения        
        protected Pol pol;                   // пол 
        protected Dolzhnost dolzhnost;       // должность сотрудника
        protected string[] nagruz;         /* сведения о загрузке сотрудника:
                                             * для преподавателя - название предмета
                                             * для инженера - название оборудования
                                            */
        protected int[] kolich;            /* сведения о количестве елиниц загрузки:
                                             * для преподавателя - кличество часов 
                                             * для инженера - количество единиц оборудования
                                            */
        public sotrudnik()
        {
            data = new int[3]; pol = Pol.неопределен; dolzhnost = Dolzhnost.неопределена;
            nagruz = new string[5]; kolich = new int[5];
        }
        public void form(string f, Pol p, Dolzhnost dol, params int[] d)
        {
            fio = f; data[0] = d[0]; data[1] = d[1]; data[2] = d[2]; pol = p; dolzhnost = dol;
        }
        public void outform(out string f,out int p,out int dol,out int d1,out int d2,out int d3)
        { f = fio; p = (int)pol; dol = (int)dolzhnost; d1 = data[0]; d2 = data[1]; d3 = data[2]; }
        public void info()
        {
            Console.WriteLine("\n--------------------------------------");
            Console.WriteLine("{0} {1}.{2}.{3} {4}", fio, data[2], data[1], data[0], pol, dolzhnost);
        }
        public string FIO
        {
            get { return fio; }
        }
 
    }
    interface Spec           // интерфейс обработки специфических данных
    {
        void vvod_spec();      // ввод данных
        void oto_spec();       // отображение данных
    }
    class prepodavatel : sotrudnik, Spec
    {
        public void vvod_spec()
        {
            Console.WriteLine("Сведения о предметах :");
            for (int i = 0; i < 5; i++)
            {
                Console.Write("Предмет : "); nagruz[i] = Console.ReadLine();
                if (nagruz[i] == "") break;
                Console.Write("Часы    : "); kolich[i] = Convert.ToInt32(Console.ReadLine());
            }
        }
        public void oto_spec()
        {
            Console.WriteLine("   Ведет предметы :");
            for (int i = 0; i < 5; i++)
            {
                if (nagruz[i] == "") break;
                Console.Write("      {0}, часы = {1}", nagruz[i], kolich[i]);
            }
            Console.WriteLine("----------------------------------------\n");
        }
    }
    class inzhener : sotrudnik, Spec
    {
        public void vvod_spec()
        {
            Console.WriteLine("Сведения об оборудовании :");
            for (int i = 0; i < 5; i++)
            {
                Console.Write("Наименование : "); nagruz[i] = Console.ReadLine();
                if (nagruz[i] == "") break;
                Console.Write("Количество   : "); kolich[i] = Convert.ToInt32(Console.ReadLine());
            }
        }
        public void oto_spec()
        {
            Console.WriteLine("   Обслуживает :");
            for (int i = 0; i < 5; i++)
            {
                if (nagruz[i] == "") break;
                Console.Write("      {0} в количестве {1} штук", nagruz[i], kolich[i]);
            }
            Console.WriteLine("----------------------------------------\n");
        }
    }
 
    class Program
    {
        static int v_pol()              // выбор пола
        {
            int pol;
            do
            {
                Console.WriteLine("Пол студента:");
                Console.WriteLine("   1. женский");
                Console.WriteLine("   2. мужской");
                Console.Write("-> ");
                pol = Convert.ToInt32(Console.ReadLine());
            } while (pol < 1 | pol > 2);
            return pol;
        }
        static void input_data(out int ch, out int mes, out int god)    // набор даты
        {
            Console.Write("Год рождения : ");
            god = Convert.ToInt32(Console.ReadLine());
            Console.Write("       Месяц : ");
            mes = Convert.ToInt32(Console.ReadLine());
            Console.Write("       Число : ");
            ch = Convert.ToInt32(Console.ReadLine());
        }
        static int input_dolzhnost()
        {
            int i;
            Console.WriteLine("Должность сотрудника :");
            do
            {
                Console.WriteLine("1. Преподаватель");
                Console.WriteLine("2. Инженер");
                i = Convert.ToInt32(Console.ReadLine());
            } while (i < 1 | i > 2);
            return i;
        }
        static void newsotr(sotrudnik[] m, ref int n)
        {
            int ch, mes, god, pol, dol;
            string fio;
            Console.Write("ФИО : ");
            fio = Console.ReadLine();
            // набор даты
            input_data(out ch, out mes, out god);
            // выбор пола
            pol = v_pol();
            // ввод должности
            dol = input_dolzhnost();
            sotrudnik T;                                     // ОП_1            
            if (dol == 1)
            {
                T = new prepodavatel();
            }
            else
            {
                T = new inzhener();
            }
            T.form(fio, (Pol)pol, (Dolzhnost)dol, god, mes, ch);
            Spec A;                 // ОП_2
            A = (Spec)T;              // ОП_3
            A.vvod_spec();          // ОП_4
            m[n] = T;                                       // ОП_5 
            n++;
        }
 
        static void Main(string[] args)
        {
            sotrudnik[] sotr = new sotrudnik[5];    // сотрудники кафедры АСОИУ
            int koso = 0;                           // количество сотрудников                        
            int kod, i;
            
 
            do
            {
                Console.WriteLine("--------------------------------");
                Console.WriteLine("\nВведено сотрудников    : {0}", koso);
                Console.WriteLine("\n1. Новый сотрудник кафедры");
                Console.WriteLine("2. Все сотрудники");
                Console.WriteLine("3. Сведения о сотруднике по его ФИО");
                Console.WriteLine("4. Великое превращение");                
                Console.WriteLine("0. Конец работы");
                kod = Convert.ToInt32(Console.ReadLine());
                switch (kod)
                {
                    case 1:
                        if (koso < sotr.Length)
                        {
                            newsotr(sotr, ref koso);
                        }
                        else Console.WriteLine("Нет маста для нового сотрудника\n");
                        break;
                    case 2:
                        for (i = 0; i < koso; i++)
                        {
                            Console.WriteLine(sotr[i].FIO);
                        }
                        break;
                    case 3: 
                        Console.WriteLine("Введите ФИО сотрудника");
                        string sfio;
                        sfio=Convert.ToString(Console.ReadLine());
                        for (i = 0; i < koso; i++)
                        {
                            if (sotr[i].FIO == sfio)
                            { sotr[i].info();
                            Spec A;
                            A = (Spec)sotr[i];
                            A.oto_spec();
                            }
                        }
 
                        break;
                    case 4:
                        
                        int ch, mes, god, pol, dol;
                        string fio;
                        
                        for (i = 0; i < koso; i++)
                        {
                            if (sotr[i] is inzhener)
                            { sotr[i].outform(out fio, out pol, out dol, out god, out mes, out ch);
                            prepodavatel T = new prepodavatel();
                            T.form(fio, (Pol)pol, (Dolzhnost)dol, god, mes, ch);
                            Spec A;
                            A = (Spec)T;              
                            A.vvod_spec();
                            sotr[i] = T;                            
                            }
                              
                        }
 
                        break;
                    
                    case 0:
                        break;
                    default:
                        Console.WriteLine("неверен выбор"); break;
                }
            } while (kod != 0);
 
        }
    }
}
0
82 / 82 / 10
Регистрация: 20.05.2011
Сообщений: 145
01.02.2012, 22:47 22
Цитата Сообщение от 444866 Посмотреть сообщение
Если ты не поймешь что я хотел, значит ты меньше меня знаешь
Сделал вывод!
Может это ты хреново формулируешь вопрос? На текущий момент 140 просмотров этой темы и тебе никто не отвечает! ПОТОМУ ЧТО НИКТО НЕ МОЖЕТ ПОНЯТЬ ЧТО ТЕБЕ НАДО!
0
Эксперт .NET
14413 / 10867 / 2872
Регистрация: 17.09.2011
Сообщений: 18,392
01.02.2012, 22:51 23
Хосспадя, на 20 сообщений блиц-срач устроили.
Интерфейс используется классом или методом, которого не интересует что именно реализует этот интерфейс, а нужно знать лишь то, что некий тип реализует определенный функционал.

Простейший пример - перебор элементов через конструкцию foreach. Допустим, есть метод, который обходит коллекцию (да что угодно, на самом деле) и что-то делает с индивидуальными ее элементами.
При этом методу абсолютно наплевать на то, какая именно структура данных используется - ему достаточно знать, что у этого типа есть определенный метод или методы, которыми он может воспользоваться для выполнения своей задачи. Для этого он принимает ссылку на интерфейс, через которую и получает доступ к интересующим его методам.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void Print(IEnumerable obj)
{
   foreach (var x in obj) Console.WriteLine(x); // Вывод в консоль каждого элемента
}
 
static void Main()
{
   // Все нижеприведенные классы реализуют интерфейс IEnumerable, значит их можно передать в метод, который принимает ссылку на этот интерфейс.
   Queue queue = new Queue();
   Stack stack = new Stack();
   ArrayList arrayList = new ArrayList();
   LinkedList linkedList = new LinkedList();
 
   // Метод Print абсолютно не заинтересован в конкретной реализации интерфеса: очередь это, стек или просто список - ему все равно. Он всего лишь обращается к методу GetEnumerator, определенному в интерфейсе IEnumerable
   Print(queue);
   Print(stack);
   Print(arrayList);
   Print(linkedList);
}
В общем-то, достаточно глянуть на методы расширений LINQ - они все основаны на работе с интерфейсов IEnumerable<T>, а уж какой именно класс их реализует - не важно.

Еще один пример - одна из перегрузок конструктора класса List<T>, которая принимает на вход ссылку на IEnumerable<T>. Это значит, что в список можно поместить элементы другого класса, реализующего этот интерфейс. А уж что это за класс - дело десятое.

Надеюсь, вам это нужно было.
1
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
01.02.2012, 22:52  [ТС] 24
Нет. Я объяснял понятней некуда уже. Просто всем пофиг либо никто не знает) все закрыли тему.
0
189 / 144 / 27
Регистрация: 02.05.2011
Сообщений: 467
01.02.2012, 22:55 25
Можно использовать интерфейсы для хранения классов от него унаследованных. Вот пример:

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
    interface I1
    {
        void doit();
    }
 
    class c1 : I1
    {
        public void doit() { }
    }
 
    class c2 : I1
    {
        public void doit() { }
    }
 
class Test
{
    List <I1> myList = new List <I1>();
    
    c1 c1Test=new c1();
    c2 c2Test=new c2();
    
    myList.Add(c1Test);
    myList.Add(c2Test);
 
}
Да простит меня turbanoff, за использование его примера.

Хотя в данном случае лучше использовать абстрактный класс вместо интерфейса, хотя с интерфейсом тоже можно
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
01.02.2012, 22:58  [ТС] 26
kolorotur нет не это. Это на мсдн есть. Я уже скинул то что мне надо было))) спасибо

Добавлено через 2 минуты
Абстрактные классы нужны если требуется наследовать класс, создавая его экземпляры. И он поддерживает только одиночное наследование. а у интерфейсов это дело не ограничено
0
Эксперт .NET
14413 / 10867 / 2872
Регистрация: 17.09.2011
Сообщений: 18,392
01.02.2012, 23:01 27
444866, ну в вашем примере то же самое.
Вот эта часть:
C#
1
2
3
Spec A;
A = (Spec)sotr[i];
A.oto_spec();
и эта:
C#
1
2
3
4
Spec A;
A = (Spec)T;              
A.vvod_spec();
sotr[i] = T;
То же самое, о чем я писал: через ссылку на интерфейс получается доступ к определенному функционалу при полном игнорировании сущности класса, который этот функционал реализует.
0
82 / 82 / 10
Регистрация: 20.05.2011
Сообщений: 145
01.02.2012, 23:05 28
Всех ёлки палки запутал!

Добавлено через 3 минуты
Весь форум сидит и ничего не знает! Ты смешной человек!
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
01.02.2012, 23:16  [ТС] 29
SpiritRI Просто вовремя не зашел тот кто знает

kolorotur спасибо просто мне был нужен пример не на базовом интерфейсе. по большей части для понятности
0
632 / 493 / 77
Регистрация: 28.07.2010
Сообщений: 895
02.02.2012, 00:07 30
Я соглашусь с SpiritRI,что вы всех запутали. Если вам нужен пример по-сложнее, то вот пример приложения, где интерфейс используется для создания плагинов: интерфейс, плагины(ОСТОРОЖНО много говнокода), и сама работа с плагинами. Думаю вам этого хватит что бы разобраться.
0
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 40
21.11.2012, 08:30 31
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
  interface I1
    {
        void doit();
    }
 
    class c1 : I1
    {
        public void doit() { }
    }
 
    class c2 : I1
    {
        public void doit() { }
    }
 
class Test
{
    List <I1> myList = new List <I1>();
    
    c1 c1Test=new c1();
    c2 c2Test=new c2();
    
    myList.Add(c1Test);
    myList.Add(c2Test);
В данном случае вопрос очевиден: зачем объявлять интерфейс, если все равно в описании каждого класса есть метод doit? Вот в чем вопрос...
Какой практический смысл?
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
21.11.2012, 08:42  [ТС] 32
Интерфейс может применяться в тех случаях, когда нужно пропихнуть через одну функцию/класс и тд и тп обьекты классов которые не имеют или не могут иметь общего наследника, но имеют общие функции/свойства и тд. (например наследники дефолтных классов.) Если не хочется заниматься копипастой кода, используем агрегацию/композицию.
0
Эксперт .NET
14413 / 10867 / 2872
Регистрация: 17.09.2011
Сообщений: 18,392
21.11.2012, 09:25 33
Цитата Сообщение от nuanred Посмотреть сообщение
зачем объявлять интерфейс, если все равно в описании каждого класса есть метод doit? Вот в чем вопрос...
Какой практический смысл?
Удалите из кода объявление интерфейса и попробуйте откомпилировать заново, после чего вопросов не останется.
0
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 40
21.11.2012, 09:30 34
Можете показать подобный пример, чтобы было понятно?
0
Эксперт .NET
14413 / 10867 / 2872
Регистрация: 17.09.2011
Сообщений: 18,392
21.11.2012, 09:35 35
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    class c1
    {
        public void doit() { }
    }
 
    class c2
    {
        public void doit() { }
    }
 
class Test
{
    List <???> myList = new List <???>();
    
    c1 c1Test=new c1();
    c2 c2Test=new c2();
    
    myList.Add(c1Test);
    myList.Add(c2Test);
Интерфейса нет.
Вместо вопросительных знаков вставьте тип, который, по-вашему, должен там быть.
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
21.11.2012, 09:50  [ТС] 36
В подобных случаях лучше делать общий абстрактный класс и от него наследоваться, а не интерфейс. Куда меньше кода в итоге получится. И копипастить doit() смысла не будет.
0
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 40
21.11.2012, 09:52 37
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
class c1
    {
        public void doit() {
                Console.WriteLine("safsdf");            }
    }
 
    class c2
    {
        public void doit() {
                Console.WriteLine("sahjghfsdf");            }
    }
 
 
    
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            
            
            List <object> myList = new List <object>();
    
            c1 c1Test=new c1();
            c2 c2Test=new c2();
    
            myList.Add(c1Test);
            myList.Add(c2Test);
вот так...
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
21.11.2012, 09:59  [ТС] 38
Такое решение не есть правильное/красивое, хотя и будет работать.
0
Эксперт .NET
14413 / 10867 / 2872
Регистрация: 17.09.2011
Сообщений: 18,392
21.11.2012, 10:04 39
Цитата Сообщение от 444866 Посмотреть сообщение
В подобных случаях лучше делать общий абстрактный класс и от него наследоваться, а не интерфейс.
Это, конечно, прекрасно, но зачастую объект уже отнаследован от другого.
Да и семантически абстрактный класс не всегда пригоден.

Цитата Сообщение от nuanred Посмотреть сообщение
вот так...
Замечательно.
А теперь попробуйте вызвать общий метод doit на любом из элементов списка по вашему выбору.
Хотя нет, давайте сделаем интереснее:
C#
1
2
3
4
5
6
var rand = new Random();
for (int i = 0; i < 10; i++)
{
   if (rand.Next(100) < 50) myList.Add(new c1());
   else myList.Add(new c2());
}
А вот теперь допишите строчку кода, где вызывается метод doit, скажем, на элементе под индексом 5.
1
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 40
21.11.2012, 10:13 40
Вооот! Теперь понял зачем нужен интерфейс!
Можно еще пару примеров?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2012, 10:13

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

Объединение двух List с разными классами
Здравствуйте уважаемые форумчане. Вопрос следующий: Имеются 2 List с разными классами: List&lt;A&gt; a;...

Передача Bitmap между разными классами
У меня есть класс static class Global и второй класс, наследник формы. Мне надо в Global хранить...

Множественное наследование интерфейсов - нужен пример
Наведите плиз пример кода множественного наследования интерфейсов?

Как организовать отрисовку разных объектов разными классами?
Начинаю писать программу для отрисовки объектов в разных программах (но пока в одной). Уточню...


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

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

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