Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
29 / 29 / 10
Регистрация: 06.02.2014
Сообщений: 156
1

Опять про интерфейсы. Зачем они?

06.02.2014, 18:21. Показов 1390. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую всех формучан!
Вот начал изучать C# уже как пол года и меня мучает вопрос зачем все таки нужны интерфейсы, какой с них толк?
Перечитал все что только можно по интерфейсам, в том числе и темы на этом форуме. Находил множество примеров где можно тупо убрать интерфейс.
Один из примеров нашел тут.
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    public interface ICoder
    {
        string encode(string str);
        string decode(string str);
    }
    //класс реализует интерфейс для шифорования слова способом прибавления одной буквы
    class SimpleCode : ICoder
    {
        //шифруем
        public string encode(string str)
        {
            string entext = "";
            for (int i = 0; i < str.Length; i++)
                entext += (char)(str[i] + 1);
            return entext;
        }
        //дешифруем
        public string decode(string str)
        {
            string detext = "";
            for (int i = 0; i < str.Length; i++)
                detext += (char)(str[i] - 1);
            return detext;
        }
    }
    //класс реализует интерфейс для шифорования слова побитовым способом
    class BitCode : ICoder
    {
        int key;
 
        public BitCode(int n)
        {
            key = n;
        }
        //шифруем
        public string encode(string str)
        {
            string entext = "";
            for (int i = 0; i < str.Length; i++)
                entext += (char)(str[i] ^ key);
            return entext;
        }
        //дешифруем
        public string decode(string str)
        {
            string detext = "";
            for (int i = 0; i < str.Length; i++)
                detext += (char)(str[i] ^ key);
            return detext;
        }
    }
 
    class Program
    {
        public static void Main()
        {
            SimpleCode ob1 = new SimpleCode();
            BitCode ob2 = new BitCode(20);
 
            string playn = "textbox";
            Console.WriteLine("Наше слово " + playn + "\nШифруем прибвлением буквы \n");
            playn = ob1.encode(playn);
            Console.WriteLine("Зашифровали " + playn);
            playn = ob1.decode(playn);
            Console.WriteLine("Дешифровали " + playn+ "\n");
            Console.WriteLine("Шифруем теперь побитово\n");
            playn = ob2.encode(playn);
            Console.WriteLine("Зашифровали " + playn);
            playn = ob2.decode(playn);
            Console.WriteLine("Дешифровали " + playn);
            Console.ReadKey();
        }
    }
}

Зачем тут нужен интерфейс? все равно же создаются экземпляры классов SimpleCode и BitCode можно просто убрать интерфейс и будит тот же результат.
Разъясните пожалуйста в чем тут фишка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2014, 18:21
Ответы с готовыми решениями:

Зачем нужны Интерфейсы
Здравствуйте. Вот такой у меня вопрос, касательно самой сути интерфейсов - зачем они нужны? В...

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

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

Зачем нужны интерфейсы?
Доброе утро, можете пожалуйста объяснить зачем нужны интерфейсы. Читаю книгу Шилдта и не понимаю....

7
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
06.02.2014, 19:00 2
D_Sergeevich, например, вы хотите создать список из SimpleCode и список из BitCode. После этого вы хотите пробежаться по спискам и посмотреть у каждого значение encode или decode. Создавать 2 разных списка для такой цели не особо удобно. Для этого вы создаете 1 список из ICoder и добавляете в этот список как SimpleCode, так и BitCode. Теперь можно перебрать список ICoder и просмотреть значение encode или decode.

Хороший пример с интерфейсом Animal. Есть животное, которое подаёт звук. И есть наследники Cat и Dog. Cat мяукает, а Dog - лает, но все они выполняют один метод sound(), объявленный в интерфейсе Animal.

Добавлено через 5 минут
D_Sergeevich, вот примерчик:

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

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
using System;
using System.Collections.Generic;
 
namespace ExampleInterface
{
    class Program
    {
        static void Main()
        {
            List<IAnimal> animals = new List<IAnimal> {new Cat(), new Dog()};
 
            foreach (IAnimal animal in animals)
            {
                animal.makeSound();
            }
 
            Console.ReadLine();
        }
    }
 
    interface IAnimal
    {
        void makeSound();
    }
 
    class Cat : IAnimal
    {
        public void makeSound()
        {
            Console.WriteLine("Кот говорит \"Мяу!\"");
        }
    }
 
    class Dog : IAnimal
    {
        public void makeSound()
        {
            Console.WriteLine("Собака говорит \"Гав!\"");
        }
    }
}
2
57 / 57 / 11
Регистрация: 04.03.2010
Сообщений: 244
06.02.2014, 19:00 3
интерфейс позволяет инкапсулировать некие действия. например вы проектируете api. делете интерфейс публичным, а класс его реализующим закрытым. далее пользователи вашего api могут работать только с интерфейсом, класс для них будет скрыт. позже вы можете полностью изменить реализацию интерфейса, при этом код пользователей ваших api останится рабочим, так как интерфейс не изменился. интерфейсы позволябт абстрагировать поведение объектов. например, поведение может меняться в зависимости от того, обладает ли объект каким-либо свойством, то есть реализует ли интерфейс, и взаимодействовать с этим объектом как с чем-то более общим, то есть
C#
1
2
3
4
5
if(obj is ICoder)
{
     var coder = obj as ICoder;
     // взаимодествие с объектом 
}
вы можете использовать интерфейс
также интерфейсы позволяют использовать принцип IoC/DI. например, приведенный вами код выглядел бы следующим образом ()при использовании Unity и прокидывании через свойсвта (что не самый лучший вариант)):
C#
1
2
[Dependency]
public ICoder ob1 { get; set; }
1
29 / 29 / 10
Регистрация: 06.02.2014
Сообщений: 156
06.02.2014, 19:01  [ТС] 4
Цитата Сообщение от Smems Посмотреть сообщение
D_Sergeevich, например, вы хотите создать список из SimpleCode и список из BitCode. После этого вы хотите пробежаться по спискам и посмотреть у каждого значение encode или decode. Создавать 2 разных списка для такой цели не особо удобно. Для этого вы создаете 1 список из ICoder и добавляете в этот список как SimpleCode, так и BitCode. Теперь можно перебрать список ICoder и просмотреть значение encode или decode.

Хороший пример с интерфейсом Animal. Есть животное, которое подаёт звук. И есть наследники Cat и Dog. Cat мяукает, а Dog - лает, но все они выполняют один метод sound(), объявленный в интерфейсе Animal.
По сути Ваш пример можно сделать и так:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
 
namespace ExampleInterface
{
    class Program
    {
        static void Main()
        {
 
            animal.makeSound();
 
            Console.ReadLine();
        }
    }
 
    class Cat
    {
        public void makeSound()
        {
            Console.WriteLine("Кот говорит \"Мяу!\"");
        }
    }
 
    class Dog
    {
        public void makeSound()
        {
            Console.WriteLine("Собака говорит \"Гав!\"");
        }
    }
}
0
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
06.02.2014, 19:01 5
D_Sergeevich, добавил в первом сообщении.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.02.2014, 19:02 6
D_Sergeevich, интерфейс нужен для безопасной поддержки множественного наследования в .Net
2
29 / 29 / 10
Регистрация: 06.02.2014
Сообщений: 156
06.02.2014, 19:17  [ТС] 7
Цитата Сообщение от Smems Посмотреть сообщение
D_Sergeevich, например, вы хотите создать список из SimpleCode и список из BitCode. После этого вы хотите пробежаться по спискам и посмотреть у каждого значение encode или decode. Создавать 2 разных списка для такой цели не особо удобно. Для этого вы создаете 1 список из ICoder и добавляете в этот список как SimpleCode, так и BitCode. Теперь можно перебрать список ICoder и просмотреть значение encode или decode.

Хороший пример с интерфейсом Animal. Есть животное, которое подаёт звук. И есть наследники Cat и Dog. Cat мяукает, а Dog - лает, но все они выполняют один метод sound(), объявленный в интерфейсе Animal.
Блин в предыдущем ответе чет не все от редактировалось. Вот.
По сути Ваш пример можно сделать и так:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
 
namespace ExampleInterface
{
    class Program
    {
        static void Main()
        {
            Cat cat = new Cat();
            Dog dog = new Dog();
            cat.makeSound();
            dog.makeSound();
 
            Console.ReadLine();
        }
    }
 
    class Cat
    {
        public void makeSound()
        {
            Console.WriteLine("Кот говорит \"Мяу!\"");
        }
    }
 
    class Dog
    {
        public void makeSound()
        {
            Console.WriteLine("Собака говорит \"Гав!\"");
        }
    }
}

В данном случае отпадает же преимущество использования интерфейса?

Добавлено через 3 минуты
Цитата Сообщение от vialet Посмотреть сообщение
интерфейс позволяет инкапсулировать некие действия. например вы проектируете api. делете интерфейс публичным, а класс его реализующим закрытым. далее пользователи вашего api могут работать только с интерфейсом, класс для них будет скрыт.
А как можно вызвать метод интерфейса при закрытом классе?
0
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
06.02.2014, 19:32 8
D_Sergeevich, а если вам нужно будет создать 100 кошек и собачек, вы тоже потом для каждой будете писать

C#
1
2
3
4
5
6
cat.makeSound();
cat.makeSound();
dog.makeSound();
cat.makeSound();
dog.makeSound();
...
Добавлено через 2 минуты
и опять таки, наследование интерфейса гарантирует то, что и у кошки, и у собаки, и у льва будут методы makeSound().
0
06.02.2014, 19:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2014, 19:32
Помогаю со студенческими работами здесь

Зачем нужны интерфейсы?
Вроде знаю, как использовать, но не понимаю, зачем например мне юзать интерфейсы.В чем их сила,...

Интерфейсы зачем их использовать
Извиняюсь что создал тему, просто не могу понять зачем . Сейчас учу интерфейсы, и не могу понять...

Зачем нужны интерфейсы?
Никак не могу понять. Вроде все методы потом объявляются в классе.

Зачем нужны приватные интерфейсы?
А точнее, где такое вообще может применяться? public class MySuperClass :...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru