Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/275: Рейтинг темы: голосов - 275, средняя оценка - 4.81
4 / 4 / 0
Регистрация: 17.05.2011
Сообщений: 262

Для чего нужны интерфейсы (не GUI)

07.09.2011, 05:27. Показов 57243. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пожалуйста, объясните новичку, для чего нужны интерфейсы! Желательно с простыми примерами для понимания.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.09.2011, 05:27
Ответы с готовыми решениями:

Для чего нужны универсальные интерфейсы типа IComparable<T>
Здравуствуйте объясните пожалуйста нормальным языком для чего нужны такие интерфейсы ??? То что в msdn написано вот тут...

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

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

18
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
07.09.2011, 08:22
Лучший ответ Сообщение было отмечено как решение

Решение

Подобная тема уже обсуждалась. В С++ была возможность множетсвенного наследования. Разработчики C# решили отказаться от этого и придумали интерфейсы. Получается что класс не может быть унаследован от нескольких классов, но при этом унаследовать несколько интерфейсов. Интерфейсы нужны для наследования. Часто необходимо реализовать несколько классов, при этом у них одинаковые методы (название), но по разному должны быть реализованы.

К примеру можно создать несколько классов: круг, квадрат, треугольник. У всех классов необходимо реализовать методы вычисления площади и периметра. Для этого нужно создать интерфейс с двумя методами. После каждый класс унаследует этот интерфейс, и по своему реализует методы.
14
48 / 48 / 1
Регистрация: 29.03.2011
Сообщений: 24
07.09.2011, 09:54
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от ikari81 Посмотреть сообщение
Пожалуйста, объясните новичку, для чего нужны интерфейсы! Желательно с простыми примерами для понимания.
Если в "человеческой " парадигме, то если класс представить как какое то устройство (для экземпляра -компьютер, магнитофон, музцентр, а так - конструкторская документация на них), то описание какого то разъема на его корпусе (такое то количество штекеров, такой то формы, с такими то сигналами) - и есть интерфейс.

в терминах ООП .NET интерфейс это просто перечисление методов, которые должны быть обязательно реализованы у класса.
представьте два класса жена и будильник. Ясно, что у них даже предков общих нет (м.б. только атомы?))
если объявить интерфейс - "iНасилие" с методом Ударить

C#
1
2
3
4
interface iНасилие
{
    void Ударить();
}
то он д.б. и у объекта жена (и его нужно обяз-но описать):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class  Жена: iНасилие // здесь и другие интерфейсы могут быть, iХочубабла, iХожувмагазин...
{
  void Ударить()
     {
       System.Beep();
       Console.WriteLine("Ты совсем охренел урод?");
     };
  void ХочуСекса()
     {
       .....
     }
     .....
}
и у объекта будильник

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class  Будильник: iНасилие // здесь и другие интерфейсы могут быть, iПитание, iЗаплился...
{
  void Ударить()
     {
       System.Halt();
       Console.WriteLine("Бабааах?");
     };
  void ТикТак()
     {
       .....
     }
     .....
}
Важно, что если мы объявим
iНасилие item; //
то
item = new Жена(); и будет работать item.Ударить()
или же
item = new Будильни(); и также будет работать item.Ударить();

Т.е. в одном списке, например, можно держать кучу разных объектов. Разных по сути и по предкам.
Но с одним и тем же интерфейсом.
И ко всем из них в цикле можно применить один и тот же метод.
И ты точно знаешь, что если у класса есть такой то интерфейс, то все методы этого интерфейса в нем обязательно реализованы (иначе не скомпилируешь).

Множественное наследие более гибкая штука (мне не нравится что ее нет в C#), но зато точно понятно, что невозможно иметь существо-наследник двух классов, будильника+жены.
Т.е. в C# это так сказать в относительно безопасной манере реализовано.
45
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
07.09.2011, 10:07
Лучший ответ Сообщение было отмечено как решение

Решение

Интерфейс в практическом смысле дает возможность указать из чего именно должен состоять тот или иной объект разрабатываемой модели без описания поведения объекта.
Например: создадим интерфейс Человек, и укажем основные параметры, которые есть у человека (грубый пример). Далее создадим класс, который реализует этот интерфейс. Видно, что для реализации интерфейса необходимо, чтобы в классе были реализованы все его члены.
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
interface IЧеловек 
    {
        string Name {get;set;}
        string Surname{get;set;}
        string Sex{get;set;}
        int Age{get;set;}
        DateTime Birthday{get;set;}
    }
 
    class Сотрудник : IЧеловек
    {
 
        #region Члены IЧеловек
 
        public string Name
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
 
        public string Surname
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
 
        public string Sex
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
 
        public int Age
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
 
        public DateTime Birthday
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
 
        #endregion
    }
То есть интерфейс позволяет в начале разработки описать основу разрабатываемой модели, так сказать определится в понятиях, где и что должно быть, без описания поведения того или иного свойства или метода.
Ну как-то так.
7
4 / 4 / 0
Регистрация: 17.05.2011
Сообщений: 262
07.09.2011, 10:13  [ТС]
т.е. интерфейс это в какой-то степени скелет класса?
0
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
07.09.2011, 10:19
Цитата Сообщение от ikari81 Посмотреть сообщение
т.е. интерфейс это в какой-то степени скелет класса?
Можно сказать и так. Хотя класс не ограничивается только элементами интерфейса, а может также содержать и собственные методы, свойства и тд. Просто наследуемый интерфейс говорит о том, что класс по-любому должен содержать.
2
48 / 48 / 1
Регистрация: 29.03.2011
Сообщений: 24
07.09.2011, 10:21
Цитата Сообщение от ikari81 Посмотреть сообщение
т.е. интерфейс это в какой-то степени скелет класса?
вы должны понимать, что интерфейс не только не класс, но даже не 100% полноценный скелет (в вашей терминологии)
т.к. в описании интерфейса не может быть полей. Но могут быть методы,свойства, события.
Т.е. интерфейс работает "внешним" состоянием предмета, описывая какое поведение у него д.б.

Но интерфейс не указывает на внутренности - т.е. на то, как хранить внутреннее состояние объекта (а его хранят в полях).

Т.е. все-таки "ядро", это сам класс. А интерфейс, развивающая его "стандартизированная нашлепка".

Добавлю, что в теории ООП интерфейсы называются еще соглашениями или контрактами (иногда используется в качестве синонимов в текстах)
1
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
07.09.2011, 23:23
важно отметить что метода, которые наследуются классом от интерфейса не должны быть закрытыми. в принципе понятно почему - интерфейс должен отображать внешнее поведение объекта, но если мне нужно использовать метод объекта интерфейса в классе, который его наследует, то мне нужно делать этот метод общедоступным чего делать мне не хотелось бы ибо он будет и у классов-наследников. у меня закрадывается мысль что здесь не интерфейс. с абстрактным классом где-то такая же ситуация - я не могу сделать ни абстрактный метод закрытым, ни виртуальный метод закрытым. этого момента я не понимаю. значит мне нужно выносить метод в другой класс и тянуть его оттуда?

большую гибкость дают интерфейсы и абстрактные классы когда вы начинаете проектировать архитектуру приложения или библиотеки, опираясь на паттерны проектирования
0
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
08.09.2011, 00:59
Цитата Сообщение от Koran Посмотреть сообщение
с абстрактным классом где-то такая же ситуация - я не могу сделать ни абстрактный метод закрытым, ни виртуальный метод закрытым. этого момента я не понимаю. значит мне нужно выносить метод в другой класс и тянуть его оттуда?
А зачем тогда вообще полиморфизм? Зачем мне, как классу-наследнику, например, закрытые виртуальные методы, которые я никогда не смогу перекрыть?
Наследуя класс от какого-нибудь TextBoxBase, я понимаю, что это разветвление в иерархии классов, и я должен либо снова сделать узел (разветвление) то бишь снова создать абстрактный класс, либо завершить это веточкой в виде TextBox.
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
08.09.2011, 10:31
Цитата Сообщение от almazsr Посмотреть сообщение
то бишь снова создать абстрактный класс
вам не обязательно создавать абстрактный класс чтобы не завершать наследование. вы можете сделать класс с виртуальными методами. а чтобы завершить наследование (запретить наследование от класса) используйте модификатор sealed.
вопрос с закрытыми виртуальными методами интересен и неясен - какие преследовались цели, делая только открытыми виртуальные методы?

Добавлено через 2 минуты
Цитата Сообщение от almazsr Посмотреть сообщение
А зачем тогда вообще полиморфизм?
полиморфизм - это не совсем чистое наследование, тоесть это наследование, но с другой стороны и я бы назвал это тонкостями наследования
0
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
08.09.2011, 18:09
Цитата Сообщение от Koran Посмотреть сообщение
вам не обязательно создавать абстрактный класс чтобы не завершать наследование. вы можете сделать класс с виртуальными методами. а чтобы завершить наследование (запретить наследование от класса) используйте модификатор sealed.
abstact не может быть sealed.
Цитата Сообщение от Koran Посмотреть сообщение
только открытыми
зачем же сразу открытыми? protected чем плох?
Цитата Сообщение от Koran Посмотреть сообщение
полиморфизм - это не совсем чистое наследование
полиморфизм - многоформность : (гибкость - в случае virtual членов) и (абстрактность, неполнота в случае abstact членов) наследников.
1
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
08.09.2011, 18:15
Цитата Сообщение от almazsr Посмотреть сообщение
abstact не может быть sealed.
ну так понятно что не может - логически не может быть. я о том, что наследник абстрактного класса можно сделать sealed

Цитата Сообщение от almazsr Посмотреть сообщение
зачем же сразу открытыми? protected чем плох?
ну да, protected - самое оно

Цитата Сообщение от almazsr Посмотреть сообщение
полиморфизм - многоформность : (гибкость - в случае virtual членов) и (абстрактность, неполнота в случае abstact членов) наследников.
чет я не понял что вы имели в виду
0
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
08.09.2011, 18:18
Цитата Сообщение от Koran Посмотреть сообщение
я о том, что наследник абстрактного класса можно сделать sealed
безусловно. я об этом и говорил. либо конкретный наследник (который может быть sealed, с вирт. методами и т.д. - неважно), либо снова абстрактный класс.
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
08.09.2011, 18:22
Цитата Сообщение от almazsr Посмотреть сообщение
sealed, с вирт. методами
это как? зачем? да и не прокатит
0
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
08.09.2011, 18:25
Koran, я через запятую написал. Перечислял, каким можно сделать класс. Либо sealed, либо virtual.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
13.11.2012, 00:20
И всётаки))
C#
1
2
3
4
5
 public interface Car
    {
        int Speed{get; set;}
        void GetInfo();
    }
C#
1
2
3
4
5
public interface Luxury
    {
        int Price{get; set;}
        void GetInfo();
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main(string[] args)
        {
            ferrari c = new ferrari();
            c.Price = 1000000;
            c.Speed = 450;
            if (c is Car)
            {
                Car tmp = (Car)c;
                tmp.GetInfo();
            }
            if (c is Luxury)
            {
                Luxury tmp2 = (Luxury)c;
                tmp2.GetInfo();
            }
            Console.ReadLine();
        }
В чём тогда отличие от
C#
1
2
3
4
5
static class Data
    {
        public static int Speed { get; set; }
        public static int Price { get; set; }
    }
??
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
13.11.2012, 01:35
в данном контексте ничем не отличается, но если тебе нужно реализовать какое-то общее поведение классов, которые в принципе ничего общего не имеют, но имеют (класс Автомобить, класс Планета, класс Монитор, которые ничего не имеют общего казалось бы) общее свойство (поведение) перемещение, но при этом разную реализацию, то проще реализовать интерфейс IMovable с методом moveTo(Point p) но с разной реализацией этого метода, то проще использовать интерфейсы. к тому же, если тебе придется взять пачку этих объектов и переместить их, то ты просто пройдешься по списку этих объектом (IMovable[]) и вызовешь их общий метод moveTo(Point p), то тебе будет пофигу как он реализован, главное, что реализован интерфейс IMovable
и вообще, чтобы лучше понять зачем нужны интерфейсы, почитай какую-то простую книгу по паттерная проектирования, а не просто параграф со справочника, где описывается такая штука, как интерфейс
1
52 / 13 / 0
Регистрация: 05.09.2014
Сообщений: 92
10.11.2015, 18:16
Если взглянуть в суть, то просто хотелось бы понять - интерфейсы ОБЯЗАТЕЛЬНЫ ? Они являются скелетами и помогают программистам "не забыть" определить методы для классов, наследующих интерфейсы. Но с точки зрения полезности - что позволяют сделать интерфейсы, чего нельзя сделать без них ? Изучая интерфейсы узнал о не обобщенных списках, то есть которые могут содержать объекты разных типов. Выше писалось, что объявление сигнатуры метода в интерфейсе гарантирует, что в любом из классов, его наследующих, будет реализация этого метода. То есть мы создаем список, который содержит, например, два экземпляра различных классов Планета и Машина. Для каждого из них будет использоваться свой метод Скорость. Первый вариант - мы унаследовали некий интерфейс при определении обоих классов, где объявлена сигнатура метода Скорости, описывая его затем внутри классов и второй вариант - мы просто объявили два класса без наследования и точно также определили метод Скорость в каждом классе. Наследование интерфейса позволяет обратиться к каждому методу объектов внутри списка с помощью цикла, а в случае отсутствия наследования этого сделать нельзя ? Или можно ? Если можно, значит "практического" применения у интерфейсов нет ? То есть это исключительно логический инструмент ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.11.2015, 02:37
Цитата Сообщение от Tini Посмотреть сообщение
интерфейсы ОБЯЗАТЕЛЬНЫ ?
Нет, как и любая другая языковая конструкция.

Цитата Сообщение от Tini Посмотреть сообщение
Они являются скелетами и помогают программистам "не забыть" определить методы для классов, наследующих интерфейсы.
Нет, они являются контрактами, гарантирующими сторонней системе/компоненту, что у данного объекта будет иметься определенный набор методов.
В языке со строгой типизацией, где компилятор должен принимать решение о том, является ли вызов определенного метода через определенную переменную легальным, это весьма полезно.

Цитата Сообщение от Tini Посмотреть сообщение
что позволяют сделать интерфейсы, чего нельзя сделать без них ?
Вы как-то странно на это смотрите.
Что позволяет сделать C#, чего не позволяют сделать ассемблер или перфокарты?
Абстракции — это в первую очередь удобство архитектуры и интеграции, а не голый функционал.

Цитата Сообщение от Tini Посмотреть сообщение
Наследование интерфейса позволяет обратиться к каждому методу объектов внутри списка с помощью цикла, а в случае отсутствия наследования этого сделать нельзя ? Или можно ?
Можно.

Цитата Сообщение от Tini Посмотреть сообщение
Если можно, значит "практического" применения у интерфейсов нет? То есть это исключительно логический инструмент ?
Интерфейс — это не логический инструмент, а инструмент моделирования.
Как и молоток, он вовсе не обязателен, но с ним определенные архитектурные задачи решаются намного легче.

В качестве практики посмотрите как и где интерфейсы используются во фреймворке и попробуйте хотя бы "на бумажке" решить те же задачи, но без их использования.
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2015, 02:37
Помогаю со студенческими работами здесь

Для чего нужны интерфейсы?
Добрый день! Почитал про интерфейсы. Появились вопросы. Во-первых, могут ли два и более класса принять участие в реализации одного...

Для чего нужны интерфейсы
Здравствуйте. Почитал про интерфейсы в Visual Basic Net. В теории как это реализовывать понятно. Не могу понять для чего нужно создавать и...

Стандартные интерфейсы нужны для стандартизации программ?
Правильно ли я понимаю, что стандартные интерфейсы (такие как IComaprer, ISet и другие) нужны для того, чтобы стандартизировать программы?...

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

Для чего нужны делегаты
Добрый день. Может кто-нибудь объяснить для чего нужны делегаты и привести пример. Уже кучу книг пересмотрел, но так всё равно и не понял,...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru