Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/79: Рейтинг темы: голосов - 79, средняя оценка - 4.61
 Аватар для CSharp
51 / 51 / 14
Регистрация: 12.01.2013
Сообщений: 779
.NET 4.x

Интерфейсы зачем их использовать

15.02.2013, 20:28. Показов 16311. Ответов 35

Студворк — интернет-сервис помощи студентам
Извиняюсь что создал тему, просто не могу понять зачем .
Сейчас учу интерфейсы, и не могу понять зачем их использовать, если все равно реализация идет в классе ? То есть даже если применять интерфейсы к трем классам то все равно надо реализовывать функции в этих трех классах. Может вы мне проясните в чем дело и как ими пользоваться ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2013, 20:28
Ответы с готовыми решениями:

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

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

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

35
08.05.2013, 18:50
Студворк — интернет-сервис помощи студентам

Не по теме:

он не летает, а падает так или иначе ;)

0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.05.2013, 19:03
Exerion, Ну так адаптер нас спасет! Только добавим метод падения:
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
    class Brick // класс кирпич. Летать не умеет (увы)
    {
        private string material;
 
        public Brick(string mat)
        {
            material = mat;
        }
 
        public Drop()
        {
            Console.WriteLine("Brick of {0} has been dropped", material);
        }
    }
 
 
 
public class FlyingBrick : IFlyable
{
   private Brick brick;
   public FlyingBrick(Brick brick)
   {
      this.brick = brick;
   }
 
   public void Fly();
   {
      Console.WriteLine("Lifting a brick...");
      brick.Drop();
   }
}
2
08.05.2013, 19:10

Не по теме:

Exerion, такая форма полета называется "крутое пике"

0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
08.05.2013, 19:11
Я же говорил что кирпич хорошо летает)
0
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 3
01.11.2015, 14:27
То есть, из ваших слов и примеров выходит только то, что применение интерфейсов необходимо лишь, когда в проекте участвуют несколько разных людей и чтобы не было разницы в понимании наполнения того или иного класса кто-то предписывает им использовать определённые интерфейсы, которые жёстко задают необходимое поведение класса. Так?
А если же программист один, то зачем ему интерфейсы? Он ведь и сам знает, что где ему нужно реализовать, где что не упустить, какой метод или свойство внедрить.
Правильно я понял?
0
54 / 53 / 5
Регистрация: 14.08.2012
Сообщений: 252
01.11.2015, 18:43
Да, всё правильно.
На деле "один программист" бывает только у себя дома, когда он пишет что-то для себя.
Даже в маленьком проекте могут участвовать 2-3 программиста. И им не обязательно продумывать интерфейсы и структуру классов. Только дальше этого офиса проект не выйдет.
Создание интерфейсов, как и абстрактных классов, говорит о том, что программист не тупой кодер и может продумывать хоть что-то наперёд.

Добавлено через 3 минуты
Цитата Сообщение от Metallurk Посмотреть сообщение
Он ведь и сам знает, что где ему нужно реализовать, где что не упустить, какой метод или свойство внедрить.
Он это знает пока пишет проект. Но через пару месяцев это всё будет забыто и придётся заново копаться в коде. Интерфейсы, абстрактные классы, паттерны - всё это создаёт структуру в программе и позволяет быстро разбираться в коде и легко его модифицировать. Но так программировать достаточно сложно и требует опыта. Всегда гораздо легче написать говнокод, который будет решать только конкретную задачу.
2
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 3
19.03.2018, 12:45
Еще пара слов о применении интерфейсов.
Не создавая новый объект, можно с помощью только преобразования его типа к другому интерфейсу, изменять видимость (а значит и доступ) к методам и свойствам класса, которых могут быть сотни. И если нет необходимости, объект не будет заряжаться дополнительными методами. Экономится память, увеличивается производительность. Вот небольшой пример:
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
interface IAdapter
    {
        string Method_3();
    }
    interface IAdapter2
    {
        string Method_3(); //метод имеет то же название
    }
 
    class A : IAdapter, IAdapter2
    {
        public string Method_1() { return "привет1"; }
        public string Method_2 () { return "привет2"; }
        string IAdapter.Method_3() { return "привет3"; }//явная реализация интерфейса
        string IAdapter2.Method_3() { return "привет3333333"; }//явная реализация интерфейса
    }
    //*************************************************************
    class Program
    {     
        static void Main(string[] args)
        {
            string str;
            A obj = new A();
            str=obj.Method_1();    //после ввода точки будут видны только Method_1 и Method_2
            Console.WriteLine(str); //печатает привет1
 
            str =(obj as IAdapter).Method_3();//после точки виден только Method_3 
            Console.WriteLine(str);//печатает привет3
 
            str = (obj as IAdapter2).Method_3();//после точки виден тоже Method_3, но он другой 
            Console.WriteLine(str);                           //печатает привет3333333
 
            Console.ReadLine();
        }     
    }
0
 Аватар для Богдан всепытный
10 / 18 / 4
Регистрация: 10.11.2017
Сообщений: 283
12.07.2018, 00:41
AceOfSpades, спасибо!
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.12.2018, 01:45
Цитата Сообщение от kolorotur Посмотреть сообщение
дам вам простое задание: напишите функцию, реализующую сортировку
Здравствуйте, а для чего давалось это задание? Вы хотели на его примере что то объяснить?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
      public void MySort(int[] arr)
        {
            int buff;
            for(int i = 0;i<arr.Length-1;i++)
                for(int j = i+1;j<arr.Length;j++)
                {
                    if(arr[j]<arr[i])
                    {
                        buff = arr[i];
                        arr[i] = arr[j];
                        arr[j] = buff;
                    }
                }
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18324 / 14250 / 5369
Регистрация: 17.03.2014
Сообщений: 28,914
Записей в блоге: 1
26.12.2018, 09:52
worldandlife, задания нужно читать и выполнять целиком
Цитата Сообщение от kolorotur Посмотреть сообщение
напишите функцию, реализующую сортировку массива любого типа.
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
27.12.2018, 15:32
OwenGlendower, пытался я пытался,весь интернет облазил, так не хотел сдаваться, но не могу сам это сделать... Возможно решение куда проще, чем я думаю, вот что мне удалось сделать. Может подскажите как правильно и имеет ли место быть мой вариант, если его закончить?
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
public class Class1
    {
        public int CompareByItem<T>(T first, T second)
        {
           // Здесь по идее нужно как то сравнивать элементы массива,
           // и возвращать 1, -1, или 0
           // Но запись if(first > second) не получится
        }
        // Делегат на метод сравнения
        public delegate int Comparison<T>(T first, T second); 
        public void BubbleSort<T>(T[] a, Comparison<T> compare)
        {
            for (int i = 0; i < a.Length; i++)
            {
                for (int j = i + 1; j < a.Length; j++)
                {
                    //Сортируем по возрастанию
                    if (compare(a[i], a[j]) < 0)
                    {
                        var temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                    }
                }
            }
        }
 
    }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18324 / 14250 / 5369
Регистрация: 17.03.2014
Сообщений: 28,914
Записей в блоге: 1
27.12.2018, 16:05
worldandlife, данный прием можно применять (сообсвтенно его можно найти в массивах и в List<T>), но в данной теме речь все-таки об интерфейсах. Тем не менее давай допишем твой вариант.

1) Делегат Comparison можно было и не объявлять - зачем создавать путаницу с одноименным системным типом.
2) Метод CompareByItem в общем виде здесь писать нет необходимости. Пользователи класса сами будут писать нужны метод и передавать ссылку на него.

Таким образом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Class1
{
    public static void BubbleSort<T>(T[] a, Comparison<T> compare)
    {
        for (int i = 0; i < a.Length; i++)
        {
            for (int j = i + 1; j < a.Length; j++)
            {
                if (compare(a[i], a[j]) > 0)
                {
                    var temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
    }
}
Применение
C#
1
2
3
4
5
6
7
8
byte[] array = new byte[10];
new Random().NextBytes(array);
// По возрастанию
Class1.BubbleSort(array, (x,y) => x > y ? 1 : x < y ? -1 : 0);
//array.Dump(); // Для LINQPad
// По убыванию
Class1.BubbleSort(array, (x,y) => x > y ? -1 : x < y ? 1 : 0);
//array.Dump(); // Для LINQPad
Если переписывать код с использованием интерфейсов, то код может быть таким
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void BubbleSort<T>(T[] array)
{
    for (int i = 0; i < array.Length; i++)
    {
        for (int j = i + 1; j < array.Length; j++)
        {
            if (array[i] is IComparable<T> comparable)
            {
                if (comparable.CompareTo(array[j]) > 0)
                {
                    (array[i], array[j]) = (array[j], array[i]);
                }
            }
            else throw new InvalidOperationException("Type must implement IComparable<T>");
        }
    }
}
1
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
27.12.2018, 19:02
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Применение
А другие типы массивов, например string, как сортировать?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18324 / 14250 / 5369
Регистрация: 17.03.2014
Сообщений: 28,914
Записей в блоге: 1
27.12.2018, 19:14
worldandlife, точно так же. Ожидается что делегат Comparison<T> возвращает отрицательное значение если первый аргумент "меньше" второго (первый должен идти перед вторым в отсортированной коллекции), положительное если "больше" (должен идти после) и ноль если они равны. Если вопрос был о то как именно сравнивать строки таким образом, то для этого есть метод Compare у строки, а также класс StringComparer.
1
7 / 2 / 0
Регистрация: 19.10.2014
Сообщений: 279
22.04.2023, 05:51
Цитата Сообщение от kolorotur Посмотреть сообщение
Интерфейс - это контракт, гарантирующий, что у данного класса будет иметься определенный набор методов и/или свойств.
Вот и всё, ничего хитрого.
А абстрактный класс это не делает так? Не правильное объяснение
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38206 / 21138 / 4311
Регистрация: 12.02.2012
Сообщений: 34,750
Записей в блоге: 14
22.04.2023, 09:24
Цитата Сообщение от CSharp Посмотреть сообщение
и не могу понять зачем их использовать
- есть очень простой способ это понять: не используй и посмотри, что получится.

Но если кратко, то интерфейсы позволяют реализовать нечто вроде множественного наследования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2023, 09:24
Помогаю со студенческими работами здесь

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

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

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

Зачем упаковывать структуры и объекты в интерфейсы?
Объясните пожалуйста кто-нибудь человеческим языком зачем упаковывать структуры и объекты в интерфейсы?

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


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru