С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/64: Рейтинг темы: голосов - 64, средняя оценка - 4.80
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Абстрактные классы и интерфейсы. Разница

01.09.2017, 18:35. Показов 12917. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот хоть убейте, не могу понять разницы между абстрактным классом и интерфейсом. До этого изучал C++, там не было интерфейсов, скорее всего из-за этого проблемы моего непонимания...
Нет, я понимаю, что в абстрактном классе могут быть методы, которые имеют реализацию, но хоть один метод должен быть абстрактным, напротив в интерфейсах все методы должны быть чистым протоколом...
В этом чтоли только различие? Ну не делай ты в абстрактном классе методов с реализацией и все, что его будет отличать от интерфейса?
Или интерфейсы сделаны для того, чтобы можно было реализовывать "неполное" множественное наследование? Ну так не запрещали бы множественного наследования...

Какие еще различия есть? Пока я не увидел глобальной разницы...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2017, 18:35
Ответы с готовыми решениями:

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

Интерфейсы и абстрактные классы
Всем привет! Помогите пожалуйста, недавно подкинули вопрос, который заинтересовал: что было бы если разработчики Майкрософт Icomparable...

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

30
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
01.09.2017, 19:16
Лучший ответ Сообщение было отмечено Bretbas как решение

Решение

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

Абстрактный Класс может наследоваться от множества интерфейсов, но только от одного
класса. Интерфейс от класса наследоваться не может.

Самое главное:
Абстрактные классы применяются когда необходимо установить какое-то поведение для всей иерархии по умолчанию.
А интерфейс применяется когда нужно расширить поведение класса.
4
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
01.09.2017, 19:28  [ТС]
RunningMan,
Цитата Сообщение от RunningMan Посмотреть сообщение
Интерфейс не может иметь полей, только методы.
Интерфейс может наследоваться только от интерфейса.
У Интерфейса члены не могут иметь модификаторов доступа, они по умолчанию открытые.
Вот этого не знал. Спасибо

Цитата Сообщение от RunningMan Посмотреть сообщение
Самое главное:
Абстрактные классы применяются когда необходимо установить какое-то поведение для всей иерархии по умолчанию.
А интерфейс применяется когда нужно расширить поведение класса.
Ну все равно же я могу вместо интерфейса использовать абстрактный класс, и нет ситуации, где только интерфейс может решить поставленную задачу, а абстрактный не мог. Правильно? Если да, то на мой взгляд, интерфейсы придумали для удобства.
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
01.09.2017, 19:36
Цитата Сообщение от Bretbas Посмотреть сообщение
Ну все равно же я могу вместо интерфейса использовать абстрактный класс, и нет ситуации, где только интерфейс может решить поставленную задачу, а абстрактный не мог.
В чём ещё особенность интерфейсов - их могут реализовывать структуры.
И если, например, метод принимает в качестве параметра интерфейс, то ему можно подсунуть как класс, так и структуру,
которые этот интерфейс реализуют. С абстрактным классом такое не пройдёт.
2
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
01.09.2017, 19:37
Абстрактный класс все таки несет в себе какую-то базовую функциональность обычно.
А интерфейс только заявляет о том, что к объекту можно обратится, используя заданный протокол, независимо от того, что из себя этот объект представляет. Это вообще не наследование никакое.
1
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
01.09.2017, 19:43
Класс не может содержать несколько методов с одинаковыми сигнатурами.
Но это становится возможным, если эти методы будут принадлежать разным интерфейсам,
а сам класс будет реализовывать их явно. Хотя, это скорее вынужденная мера, чем фича.
1
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
01.09.2017, 20:04
Bretbas, Главное понять семантику этих двух вещей. Причем в отвязке от программирования. Где в вашей повседневной жизни встречаются интерфейсы и какая их роль. А где абстракции.
Затем уже возвращаясь к нашему родному C# все станет очевидным. Это же ООП. Здесь мы описываем различные вещи понятным нам способом, который с детства наблюдаем в нашей объективной реальности)

Абстрактный класс - это обычный класс с некоторой "неопределенностью"
Интерфейс - это перечень членов класса, с которыми может работать внешний код (необязательно все сразу).
3
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
01.09.2017, 20:14
Цитата Сообщение от sldp Посмотреть сообщение
Причем в отвязке от программирования.
Цитата Сообщение от Bretbas Посмотреть сообщение
До этого изучал C++, там не было интерфейсов,
Bretbas,
если нет ключевого слова Interface в С++, это же не значит что там нет интерфейсов.
видел ответ, сейчас нашел пост№4
Чем отличается интерфейс от абстрактного класса?
1
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.09.2017, 20:30
Цитата Сообщение от Bretbas Посмотреть сообщение
Какие еще различия есть? Пока я не увидел глобальной разницы...
Множественное наследование и возможность реализации. Интерфейс умеет в первое, абстрактный класс -- второе.

Цитата Сообщение от Bretbas Посмотреть сообщение
Ну все равно же я могу вместо интерфейса использовать абстрактный класс, и нет ситуации, где только интерфейс может решить поставленную задачу, а абстрактный не мог. Правильно?
Неправильно. Вот пример: реализовать список через IEnumerable, с выгрузкой ресурсов через IDisposeble для дальнейшей унификации и удобства. Если бы изначальные Linq и using завязывались на абстрактных классах, то мы не смогли бы создать класс вмещающий оба этих интерфейсов, пришлось бы заново реализовывать эти фичи для третьего класса.

Цитата Сообщение от Bretbas Посмотреть сообщение
но хоть один метод должен быть абстрактным
Нет. Можно вообще обьявить абстрактный класс без методов/полей/конструкторов.

Цитата Сообщение от RunningMan Посмотреть сообщение
Интерфейс не может иметь полей, только методы.
Еще может иметь свойства и ивенты (хотя это по сути те же методы).

Добавлено через 5 минут
Цитата Сообщение от RunningMan Посмотреть сообщение
если нет ключевого слова Interface в С++, это же не значит что там нет интерфейсов.
Я сейчас очень смутно помню курс плюсов в универе, но кажись это не решает проблему множественного наследования.
3
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
01.09.2017, 20:35
Цитата Сообщение от Wolfdp Посмотреть сообщение
еще может иметь свойства и ивенты (хотя это по сути те же методы).
Да, стоило уточнить.
Цитата Сообщение от Wolfdp Посмотреть сообщение
Я сейчас очень смутно помню курс плюсов в универе, но кажись это не решает проблему множественного наследования.
Не решает.
В С++ интерфейс -- условность, которую легко нарушить.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
01.09.2017, 20:45  [ТС]
RunningMan,
Цитата Сообщение от RunningMan Посмотреть сообщение
если нет ключевого слова Interface в С++, это же не значит что там нет интерфейсов.
Интерфейс как понятие - конечно есть в C++, но явно назвать это интерфейсом и выделить это в коде - такого нет.

Fleder,
Цитата Сообщение от Fleder Посмотреть сообщение
В чём ещё особенность интерфейсов - их могут реализовывать структуры
Это наверное единственное, что не могут абстрактные классы Не могут быть базовыми под структуры.

Цитата Сообщение от Fleder Посмотреть сообщение
Класс не может содержать несколько методов с одинаковыми сигнатурами.
Вот это не совсем понял? Ну вот методы с одинаковыми сигнатурами:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class B
    {
        public int c(int k, int l)
        {
            return 0;
        }
        public int d(int k, int l)
        {
            return 0;
        }
        public int e(int k, int l)
        {
            return 0;
        }
    }
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
01.09.2017, 20:47
Буду кэпом
Сигнатура включает имя
3
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.09.2017, 20:55
Цитата Сообщение от Bretbas Посмотреть сообщение
не могу понять разницы между абстрактным классом и интерфейсом.
Bretbas, дабы не повторять что уже сказано, почитайте тут. На мой взгляд, это довольно доходчивое и наглядное разъяснение, в чем их отличие.
3
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
01.09.2017, 20:56
Цитата Сообщение от Bretbas Посмотреть сообщение
Вот это не совсем понял? Ну вот методы с одинаковыми сигнатурами
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
   interface A
   {
      int c(int k, int l);
   }
 
   interface C
   {
      int c(int k, int l);
   }
 
   class B : A, C
   {
      int A.c(int k, int l)
      {
         throw new NotImplementedException();
      }
 
      int C.c(int k, int l)
      {
         throw new NotImplementedException();
      }
 
      public int c(int k, int l)
      {
         throw new NotImplementedException();
      }
   }
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
01.09.2017, 21:13  [ТС]
RunningMan,
Цитата Сообщение от RunningMan Посмотреть сообщение
Буду кэпом
Сигнатура включает имя
Сорри, точно.
Цитата Сообщение от RunningMan Посмотреть сообщение
В С++ интерфейс -- условность, которую легко нарушить.
Ну я об этом и говорю.

Wolfdp,
Цитата Сообщение от Wolfdp Посмотреть сообщение
Неправильно. Вот пример: реализовать список через IEnumerable, с выгрузкой ресурсов через IDisposeble для дальнейшей унификации и удобства. Если бы изначальные Linq и using завязывались на абстрактных классах, то мы не смогли бы создать класс вмещающий оба этих интерфейсов, пришлось бы заново реализовывать эти фичи для третьего класса.
Ну так я я говорю, потому что запретили множественное наследование от классов. Если бы оно было возможно, то ваш пример можно было решить на абстрактных классах.
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
02.09.2017, 00:04
Цитата Сообщение от Bretbas Посмотреть сообщение
Ну так я я говорю, потому что запретили множественное наследование от классов. Если бы оно было возможно, то ваш пример можно было решить на абстрактных классах.
Скажи, мало того, что запретили ради целостности каких-то парадигм, так еще и реализовали криво - в итоге вызов метода
через интерфейс выполняется дольше чем виртуального
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
02.09.2017, 08:00  [ТС]
Aael,
Цитата Сообщение от Aael Посмотреть сообщение
в итоге вызов метода
через интерфейс выполняется дольше чем виртуального
Внатуре? А почему так то? Виртуальный долго вызывается, а интерфейсный еще дольше?
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
02.09.2017, 09:03
Цитата Сообщение от Aael Посмотреть сообщение
так еще и реализовали криво - в итоге вызов метода
через интерфейс выполняется дольше чем виртуального
Можно разьяснить сей момент? Просто банально затестив лярд вызов из базового, интерфейса и класса напрямую, особой разницы не увидел

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
    class Program
    {
        static void Main(string[] args)
        {
            for (var k = 0; k < 5; k++)
            {
 
                var sw = new Stopwatch();
 
                //
                BaseMyClass _base = new MyClass();
                sw.Restart();
                for (var i = 0; i < int.MaxValue; i++)
                    _base.Nyan();
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
 
                //
                IMyClass _interface = new MyClass();
                sw.Restart();
                for (var i = 0; i < int.MaxValue; i++)
                    _interface.Nyan();
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
 
                //
                MyClass _class = new MyClass();
                sw.Restart();
                for (var i = 0; i < int.MaxValue; i++)
                    _class.Nyan();
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
                Console.WriteLine("Nya!");
 
            }
            Console.ReadKey();
        }
    }
 
    interface IMyClass
    {
        void Nyan();
    }
 
    abstract class BaseMyClass
    {
        public virtual void Nyan() { }
    }
 
    class MyClass : BaseMyClass, IMyClass
    {
        public override void Nyan() { }
    }
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
00:00:09.9558221
00:00:09.2383365
00:00:08.9972914
Nya!
00:00:09.1373085
00:00:09.1952214
00:00:09.0136659
Nya!
00:00:08.9679814
00:00:09.4542107
00:00:09.2396572
Nya!
00:00:09.0060120
00:00:09.3823738
00:00:08.9392457
Nya!
00:00:09.1492015
00:00:09.2564391
00:00:09.0448699
Nya!
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
02.09.2017, 09:59
Wolfdp, не профи, но судя по всему у интерфейса своя таблица накостыленная поверх обычной и при исполнении происходят "лишние" вызовые, что дает существенный повод для оптимизации с отказом от использования интрефейсов (сарказм). Вот есть статья (перевод и обсуждение). Кстати, есть такойже тест как у вас (здесь) где документально подтверждено, что интерфейсы медленнее.

* пс за актуальность информации не отвечаю
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
02.09.2017, 11:03  [ТС]
Wolfdp, Aael, Имелось ввиду вызова одного и того же метода из базового, интерфейсного и самого класса? Или все-таки сравнить вызов абстрактного метода с вызовом метода интерфейса?

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
...
interface IMyInteface
{
    void Method();
}
abstract class AbstractClass
{
    public abstract void Method();
}
 
class AInterface : IMyInteface
{
    public void Method() {}
}
class AClass : AbstractClass
{
    public override void Method() {}
}
 
class Program
{
    static void Main(string[] args)
    {   
        AInterface ai = new AInterface();
        AClass ac = new AClass();
        var sw = new Stopwatch();
 
        sw.Restart();
        for( int i = 0; i < int.MaxValue; i++ )
            ai.Method();
        sw.Stop();
        Console.WriteLine( "Invoke interface method: {0}", sw.Elapsed );
 
        sw.Restart();
        for( int i = 0; i < int.MaxValue; i++ )
            ac.Method();
        sw.Stop();
        Console.WriteLine( "Invoke abstract class method: {0}", sw.Elapsed );
 
        Console.ReadLine();
    }
}
Вот такой код мне каждый раз показывает вывод в пользу интерфейсов:
C#
1
2
Invoke interface method: 00:00:20.5515762
Invoke abstract class method: 00:00:26.6089119
Кстати, хотел узнать еще такой момент. Допустим есть класс, назовем его MyClass, который поддерживает определенный интерфейс IMyInterface. В интерфейсе объявлен метод, назовем его void Method(). Мне при проектировании этого класса MyClass, лучше явно указывать, что void Method() это метод интерфейса IMyInterface? Тоесть:
C#
1
2
3
4
5
6
7
class MyClass : IMyInterface
{
    void IMyInterface.Method()
    {
        ...
    }
}
Ведь может возникнуть ситуация, что при расширении проектирования программного обеспечения данной задачи, может понадобится еще несколько интерфейсов для класса MyClass, а у них может оказаться тоже метод void Method(), и придется заново переписывать класс MyClass для предотвращения этой неоднозначности
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2017, 11:03
Помогаю со студенческими работами здесь

Интерфейсы и абстрактные классы: обеспечить работу методов в конечном классе
Имеются два шаблонных интерфейса, в которых описан метод Print() От этих двух интерфейсов наследуется шаблонный абстрактный класс в...

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

абстрактные классы
помогите пожалуийстаб не доет правильный ответ, не могу найти ошибку. Спасибо abstract class Shape { protected double...

Абстрактные классы
Всем привет! Вопрос такой: Есть абстрактный класс, а в нем абстрактный метод, который должен заменять значения свойств и полей класса....

Интерфейс и абстрактные классы
После прочтения Хабро-статьи http://habrahabr.ru/post/169949/, после коммента: &quot;Стандартные вопросы тоже не стоит оставлять без внимания....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru