Интерфейс в C++ реализован как абстрактный класс, т. Е. Чистый виртуальный метод. Аналогичным образом, абстрактный класс на C++ также реализуется аналогичным образом. Могу ли я сказать, что интерфейс и абстрактный те же самые в C++, за исключением понятия, что интерфейс может быть глаголом - поведение и абстрактный класс являются существительным. Правильно ли я понимаю? Я задаю этот вопрос, потому что шаблоны проектирования - говорит об интерфейсе и абстрактном по-разному. Кроме того, причина в том, что JAVA имеет два разных ключевых слова - интерфейс и абстрактный. Нам нужно внедрить интерфейс в java. И нам нужно расширить абстрактный класс. Однако в CPP мы наследуем только от абстрактного класса, а затем реализуем.В чем разница между абстрактным и интерфейсом в контексте C++?
ответ
Нет, абстрактные классы могут обеспечивать поведение по умолчанию для методов; интерфейсы являются чисто виртуальными и не могут. Это принципиально другое.
поведение и абстрактный класс является существительным
Это не имеет никакого смысла. Поведение всегда глагол.
Точка абстрактных классов и интерфейсов - это полиморфизм: разные типы поведения в зависимости от типа исполнения.
Если все его методы абстрактны, и нет элементов данных, класс C++ действительно и интерфейс. Однако класс уже абстрактный, если он имеет хотя бы один абстрактный метод. Все еще могут быть определения для других виртуальных функций, не виртуальных функций и элементов данных. Ни один из них не входит в интерфейс.
Причина, по которой Java имеет определенный синтаксис для классов interface
, заключается в том, что Java не поддерживает множественное наследование (классов без интерфейса).
С другой стороны, C++ поддерживает множественное наследование и, следовательно, не требует определения класса интерфейса на уровне языка.
В классе C++ является абстрактным, если он имеет хотя бы одну чистую виртуальную функцию-член. В классах проектирования OO без реализации метода называются интерфейсы. Поэтому, учитывая эту точку зрения, хотя для нее нет специального синтаксиса в языке, интерфейс в C++ является просто абстрактным классом, который не имеет функций-членов, которые не являются чисто виртуальными, т. Е. Все функции-члены являются чисто виртуальными. Таким образом, интерфейсные классы представляют собой подмножество абстрактных классов, а не то же самое, что вы предлагаете.
Конечно, слово интерфейс имеет больше значений, чем только в контексте классов интерфейса. Например, вы обычно рассматриваете интерфейс библиотеки как все, что определено в заголовочном файле (-ах) этой библиотеки. Сюда входят все определения классов, функции, глобальные таблицы и их документация.
Проблема, с которой вы сталкиваетесь, объясняется главным образом тем, что «классическая терминология ООП» была разработана независимо от языка C++, что в свою очередь не является чистым языком ООП.
Несмотря на этот факт, во многих курсах программирования есть историческая тенденция преподавать C++ через ООП, тем самым заставляя парадигму ООП на C++ даже там, где парадигма C++ шире.
В чистом «интерфейс» ООП терминологии означает «описании внешнего поведения» (в отличие от «реализации»), в то время как «абстрактные» означает «описывая что-то на более высоком уровне» (в отличие от «бетон»)
Язык, подобный Java, где подстановка OOP реализована с наследованием, которое было разработано именно для этого purose, «интерфейс» является «абстрактным», а класс «все более конкретным», как идя вниз по иерархии объектов.
Наследование C++ отличается: оно имеет в своей основе - не имеет ничего общего с подстановкой ООП и наследованием Java, не требует, чтобы методы были виртуальными и могут быть краткими. В общем смысле парадигмы это всего лишь механизм агрегирования языка, доступного для объединения вещей.
Набор проблем, которые вы можете описать с ним, шире, чем те, которые принадлежат ООП, и в то же время не охватывают все Java. Но вы все равно можете поместить их, если вы заставите себя в определенной дисциплине.
Следовательно:
- Класс со всеми чистыми виртуальными методами (
virtual method(params)=0
) и виртуальный dcestructor, если смотреть с точки зрения ООП играет как интерфейс - Класс со всеми виртуальная наследуется методы, реализованные это как реализация.
Но C++ допускает также все промежуточные случаи (где реализуются только некоторые методов) и допускает происхождение реализации прийти не только по одному пути наследства предков дерев.
Фактически C++ допускает полную «схему множественного наследования», в то время как java допускает «частичное множественное наследование», причем только один класс и множество интерфейсов (это означает, что все реализованные методы должны исходить с одной стороны дерева)
Вы можете заставить C++ подчиняться той же дисциплине, что и java, допуская (искусственно на данный момент), что только унаследованный базовый класс может предоставлять методы, в то время как другие могут только объявлять их и называть «класс» первым и "интерфейс" других.
Но, говоря языком, между ними нет концептуального различия.
Как вы сказали, интерфейс в C++ реализован с использованием абстрактного класса с только чистых виртуальных функций. Чистая виртуальная функция должна быть переопределена любым конкретным (т. Е. Не абстрактным) производным классом. Добавляя выражение = 0 к виртуальной функции, мы указываем, что виртуальная функция является чистой виртуальной функцией. Абстрактным классом является класс, который содержит не менее одной чистой виртуальной функции.
Например:
class AbstractBase {
public:
const char* Hello() { return "Hello World!"; } // a normal non-virtual function
virtual void Method_1() {} // a normal virtual function
virtual int Method_2() = 0; // a pure virtual function makes AbstractBase class not instantiable
};
class InterfaceBase {
public:
const char* Hello() = 0; // a pure virtual function
virtual void Method_1() = 0; // a pure virtual function
virtual int Method_2() = 0; // a pure virtual function
};
Рассмотрим это таким образом: Есть два типа функций
Concrete
- тот, который имеет некоторый код, и на самом деле выполняет задачу.Virtual
-Это не имеет никакого кода и переопределяется каким-либо другим конкретным классом в соответствии с локальной потребностью этого класса. Виртуальная функция задается путем размещения в объявлении «= 0».
Теперь interface
пустая оболочка, в которой все функции должны быть виртуальными functions.It это просто pattern.It предназначен быть полностью изменен программистом путем переопределения его виртуальные функции.
Но, abstract class
- это класс, который частично реализован программистом. То есть он должен иметь хотя бы одну виртуальную функцию, но не обязательно все.
Возможный дубликат [Как вы объявляете интерфейс в C++?] (Http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c) – edmz