Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/168: Рейтинг темы: голосов - 168, средняя оценка - 4.80
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
1

Чем отличается интерфейс от абстрактного класса?

28.02.2013, 20:14. Показов 31616. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос дошел от знакомого, говорит услышал его на собеседовании. В с++ интерфейса как такового нет, но вопрос был задан именно по этому языку. Дайте разъяснения
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2013, 20:14
Ответы с готовыми решениями:

Как организовать интерфейс в виде абстрактного класса?
У меня есть задание, вот его часть: - расчёты движения предмета должны осуществляться в...

Чем отличается шаблонный метод класса от шаблонного класса?
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок...

Чем отличается метод класса от конструктора класса?
В ООП, чем отличается метод класса от конструктора класса? Для чего нужен конструктор класса?

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

17
117 / 116 / 8
Регистрация: 23.12.2012
Сообщений: 195
28.02.2013, 21:51 2
Если не ошибаюсь, в С++ класс называется абстрактным, если в нем есть хотя бы один чисто виртуальный метод. Ну а интерфейс в принципе не может иметь реализацию. Таким образом, интерфейс средствами языка реализуется как абстрактный класс, все методы которого чисто виртуальные.
2
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 14:16  [ТС] 3
Спасибо, за ответ. Могу попросить еще один пример что-то вроде:
C++
1
2
3
4
5
class Foo // абстрактный класс
{
 virtual Draw(){} = 0;
// присутствуют другие методы и конст. дестр по умолчанию
}
C++
1
2
3
4
5
6
7
class Shape // интерфейс
{
virtual Draw() {} = 0;
virtual Shape() {} = 0;
virtual ~Shape() {} = 0;
virtual Release() {} = 0;
}
Верно?
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
01.03.2013, 14:45 4
vbloodv, с точки зрения ООП, интерфейс - это чисто абстрактный класс. В свою очередь, чисто абстрактный класс - абстрактный класс, не содержащий данных и определенных методов. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//интерфейс
class ICustom
{
public:
  virtual void DoSomething()=0;
  virtual ~ICustom();
};
 
//абстрактный класс
class TAbstractClass
{
private:
  bool State;
public:
  virtual void DoSomething()=0;
  bool GetState();
  virtual ~TAbstractClass();
};
2
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 15:05  [ТС] 5
Цитата Сообщение от HighPredator Посмотреть сообщение
class TAbstractClass
Префикс T перед AbstractClass обозначает абстрактный класс и что это за нотация где можно это прочесть?
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 15:11 6
Мне кажется, за такой вопрос по голове нужно дать было. Понятие интерфейса - не ограничивается понятием класса с какими-то (описаны выше) ограничениями. В C++ есть абстрактные классы. Но нет термина интерфейс. ( и с чем сравнивать? (вопрос риторический) )

Добавлено через 2 минуты
Цитата Сообщение от vbloodv Посмотреть сообщение
Префикс T перед AbstractClass обозначает абстрактный класс и что это за нотация где можно это прочесть?
Едва ли Т здесь означает абстрактный. С I - все понятно. А остальные классы лучше не предварять ничем, ибо, как ты только что убедился, нотаций 10000000000, и такой префикс больше вопросов вызывает. В отличие от I, к которому привыкли.

Добавлено через 3 минуты
Цитата Сообщение от HighPredator Посмотреть сообщение
чисто абстрактный класс
Такого понятия вообще не существует Можно с таким же успехом назвать класс "ну ооооочень абстрактным, абстрактнее некуда"?
2
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
01.03.2013, 15:17 7
ITcrusader, это не термин языка. Это термин в рамках концепции объектно-ориентированного программирования. Так что вопрос вполне корректный.

Добавлено через 51 секунду

Не по теме:

С префикса T я обозначаю типы данных за исключением явных указателей и интерфейсов

3
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 15:42  [ТС] 8
Цитата Сообщение от HighPredator Посмотреть сообщение
ITcrusader, это не термин языка. Это термин в рамках концепции объектно-ориентированного программирования. Так что вопрос вполне корректный.
Извиняюсь, наверное это я ввел в заблуждение вас сказал что это в рамках языка! Что понимать под символом "T" вопрос открыт для меня я не понимаю?

Цитата Сообщение от ITcrusader Посмотреть сообщение
(вопрос риторический)
Напоминает мне вопрос о том какой объект может иметь sizeof == 0;

Добавлено через 7 минут
Цитата Сообщение от ITcrusader Посмотреть сообщение
Такого понятия вообще не существует Можно с таким же успехом назвать класс "ну ооооочень абстрактным, абстрактнее некуда"?
Насколько я знаю, чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию. Читал это в вопросах в блоге Алены С++
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
01.03.2013, 15:54 9
Цитата Сообщение от vbloodv Посмотреть сообщение
Что понимать под символом "T" вопрос открыт для меня
Я объяснил выше
Цитата Сообщение от HighPredator Посмотреть сообщение
С префикса T я обозначаю типы данных за исключением явных указателей и интерфейсов
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
01.03.2013, 16:06 10
В С++, кажется, интерфейсов нет. А в Jave есть. Интерфейс внешне похож на абстрактный класс, но классом не является. Для абстрактного класса можно создавать классы-потомки (и, впоследствии, объекты). А интерфейс реализуется в каком-либо классе. Это несколько другой (по сравнению с наследованием) способ повторного использования кода.
1
Эксперт по пяченькам
67 / 67 / 12
Регистрация: 16.08.2011
Сообщений: 249
01.03.2013, 16:08 11
Цитата Сообщение от vbloodv Посмотреть сообщение
чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию.
Хотя бы одну чисто виртуальную функцию имеет абстрактный класс. А как я понял - чисто абстрактный класс - это класс у которого все функции чисто виртуальные.

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
В С++, кажется, интерфейсов нет
Правильней сказать в C++ интерфейс реализуется через абстрактный класс.
1
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 16:40  [ТС] 12
Цитата Сообщение от Catstail Посмотреть сообщение
Интерфейс внешне похож на абстрактный класс, но классом не является.
Можно ваш пример пожалуйста хотя бы псевдокод
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:01 13
Цитата Сообщение от vbloodv Посмотреть сообщение
Напоминает мне вопрос о том какой объект может иметь sizeof == 0;
Это вполне нормальный вопрос. Ответ на него обозначен в стандарте.

Цитата Сообщение от vbloodv Посмотреть сообщение
Насколько я знаю, чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию. Читал это в вопросах в блоге Алены С++
"Чисто" - может относиться к виртуальной функции, но не классу. Класс, будь в нем 1, 2, ...50 чисто виртуальных функций не становится называется "абстрактным", НЕ более того, в независимости от того, есть ли в нем еще и обычные функции или нет. Кем-то придуманное выражение "чисто виртуальный класс", в C++ своего отражения
не находит. Почему я об этом пишу и придираюсь к словам? Да потому что на собеседованиях иногда странные вопросы задают.


An abstract class is a class that is designed to be specifically used as a base class. An abstract class contains at least one pure virtual function. You declare a pure virtual function by using a pure specifier (= 0) in the declaration of a virtual member function in the class declaration.
0
Эксперт по пяченькам
67 / 67 / 12
Регистрация: 16.08.2011
Сообщений: 249
01.03.2013, 17:18 14
Цитата Сообщение от ITcrusader Посмотреть сообщение
"Чисто" - может относиться к виртуальной функции, но не классу.
Ну с точки зрения теории - да. Но на практике достаточно часто абстрактные классы, которые имеют только чисто виртуальные функции называют "чисто абстрактными классами", а также "полностью абстрактными классами", чтобы подчеркнуть, что они имеют только описание, но не имеет реализацию. На мой взгляд, эти термины достаточно удачны.
2
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:21 15
StasGamilton, ну да, я в своих тут пышных постах жестко привязываюсь к терминологии Если ты говоришь чисто абстрактный класс - тебя несомненно поймет большинство коллег, с этим я не спорю)))
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.03.2013, 19:20 16
Лучший ответ Сообщение было отмечено как решение

Решение

Вырезка:
C++ поддерживает множественное наследование и абстрактные классы, поэтому, как уже упоминалось выше, отдельная синтаксическая конструкция для интерфейсов в этом языке не нужна. Интерфейсы определяются при помощи абстрактных классов, а реализация интерфейса производится путём наследования этих классов. Благодаря наличию множественного наследования, ничто не мешает реализовать в одном классе несколько интерфейсов, если в этом есть необходимость
4
Эксперт по пяченькам
67 / 67 / 12
Регистрация: 16.08.2011
Сообщений: 249
01.03.2013, 19:24 17
Кстати чисто абстрактный класс используется не только в русскоязыных источниках. Пример на WikiBooks
Интересно, что этот термин употребляет и Липпман:
http://msdn.microsoft.com/en-us/magazine/cc163516.aspx]MSDN Magazine.
3
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
02.03.2013, 02:10 18
Касательно Java: (полезно знать как это в других ОО языках, т.к. понятия и термины часто путаются и заимствуются)
Абстрактные классы используются только тогда, когда есть "is a" тип отношений; интерфейсы могут быть реализованы классами которые не связаны друг с другом.
Абстрактный класс может реализовывать методы; интерфейс не может реализовывать методы.
Интерфейс может только описывать константы и методы, но не реализовывать их. Все методы интерфейса по-умолчанию являются публичными (public) и абстрактными (abstract), а поля - public static final.
В Java класс может наследоваться (реализовывать) от многих интерфейсов, но только от одного абстрактного класса.
С абстрактными классами вы теряете индивидуальность класса, наследующего его; с интерфейсами вы просто расширяете функциональность каждого класса.

Если друг шел в кампанию, где слушал его Java-прогер (например когда требуют знания C++/Java) то он хотел бы услышать именно это. А т.к. языки имеют схожие концепции, то могут ошибочно полагать, что у них все, что связано с объектами реализовано одинаково или понятия существуют один в один. Думаю, с вашим другом как раз оное и было (попался на человека, который прогает на Java), либо не смог внятно объяснить что к чему, на таком тоже ловят.
0
02.03.2013, 02:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2013, 02:10
Помогаю со студенческими работами здесь

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

Операция new для потомков абстрактного класса, у которых есть интерфейс
Есть класс public abstract class ReestrElement есть классы-наследники public class...

Чем отличается объект класса от экземпляра класса
Читаю книгу "PHP Объекты, шаблоны и методики программирования" автор Мэт Зандстра. Перевод на...

Чем отличается конструктор класса от экземпляра класса?
Чем отличается конструктор класса от экземпляра класса?


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

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