2014-11-03 10 views
0

Интерфейс в C++ реализован как абстрактный класс, т. Е. Чистый виртуальный метод. Аналогичным образом, абстрактный класс на C++ также реализуется аналогичным образом. Могу ли я сказать, что интерфейс и абстрактный те же самые в C++, за исключением понятия, что интерфейс может быть глаголом - поведение и абстрактный класс являются существительным. Правильно ли я понимаю? Я задаю этот вопрос, потому что шаблоны проектирования - говорит об интерфейсе и абстрактном по-разному. Кроме того, причина в том, что JAVA имеет два разных ключевых слова - интерфейс и абстрактный. Нам нужно внедрить интерфейс в java. И нам нужно расширить абстрактный класс. Однако в CPP мы наследуем только от абстрактного класса, а затем реализуем.В чем разница между абстрактным и интерфейсом в контексте C++?

+0

Возможный дубликат [Как вы объявляете интерфейс в C++?] (Http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c) – edmz

ответ

0

Нет, абстрактные классы могут обеспечивать поведение по умолчанию для методов; интерфейсы являются чисто виртуальными и не могут. Это принципиально другое.

поведение и абстрактный класс является существительным

Это не имеет никакого смысла. Поведение всегда глагол.

Точка абстрактных классов и интерфейсов - это полиморфизм: разные типы поведения в зависимости от типа исполнения.

0

Если все его методы абстрактны, и нет элементов данных, класс C++ действительно и интерфейс. Однако класс уже абстрактный, если он имеет хотя бы один абстрактный метод. Все еще могут быть определения для других виртуальных функций, не виртуальных функций и элементов данных. Ни один из них не входит в интерфейс.

0

Причина, по которой Java имеет определенный синтаксис для классов interface, заключается в том, что Java не поддерживает множественное наследование (классов без интерфейса).

С другой стороны, C++ поддерживает множественное наследование и, следовательно, не требует определения класса интерфейса на уровне языка.

В классе C++ является абстрактным, если он имеет хотя бы одну чистую виртуальную функцию-член. В классах проектирования OO без реализации метода называются интерфейсы. Поэтому, учитывая эту точку зрения, хотя для нее нет специального синтаксиса в языке, интерфейс в C++ является просто абстрактным классом, который не имеет функций-членов, которые не являются чисто виртуальными, т. Е. Все функции-члены являются чисто виртуальными. Таким образом, интерфейсные классы представляют собой подмножество абстрактных классов, а не то же самое, что вы предлагаете.

Конечно, слово интерфейс имеет больше значений, чем только в контексте классов интерфейса. Например, вы обычно рассматриваете интерфейс библиотеки как все, что определено в заголовочном файле (-ах) этой библиотеки. Сюда входят все определения классов, функции, глобальные таблицы и их документация.

0

Проблема, с которой вы сталкиваетесь, объясняется главным образом тем, что «классическая терминология ООП» была разработана независимо от языка C++, что в свою очередь не является чистым языком ООП.

Несмотря на этот факт, во многих курсах программирования есть историческая тенденция преподавать C++ через ООП, тем самым заставляя парадигму ООП на C++ даже там, где парадигма C++ шире.

В чистом «интерфейс» ООП терминологии означает «описании внешнего поведения» (в отличие от «реализации»), в то время как «абстрактные» означает «описывая что-то на более высоком уровне» (в отличие от «бетон»)

Язык, подобный Java, где подстановка OOP реализована с наследованием, которое было разработано именно для этого purose, «интерфейс» является «абстрактным», а класс «все более конкретным», как идя вниз по иерархии объектов.

Наследование C++ отличается: оно имеет в своей основе - не имеет ничего общего с подстановкой ООП и наследованием Java, не требует, чтобы методы были виртуальными и могут быть краткими. В общем смысле парадигмы это всего лишь механизм агрегирования языка, доступного для объединения вещей.

Набор проблем, которые вы можете описать с ним, шире, чем те, которые принадлежат ООП, и в то же время не охватывают все Java. Но вы все равно можете поместить их, если вы заставите себя в определенной дисциплине.

Следовательно:

  • Класс со всеми чистыми виртуальными методами (virtual method(params)=0) и виртуальный dcestructor, если смотреть с точки зрения ООП играет как интерфейс
  • Класс со всеми виртуальная наследуется методы, реализованные это как реализация.

Но C++ допускает также все промежуточные случаи (где реализуются только некоторые методов) и допускает происхождение реализации прийти не только по одному пути наследства предков дерев.

Фактически C++ допускает полную «схему множественного наследования», в то время как java допускает «частичное множественное наследование», причем только один класс и множество интерфейсов (это означает, что все реализованные методы должны исходить с одной стороны дерева)

Вы можете заставить C++ подчиняться той же дисциплине, что и java, допуская (искусственно на данный момент), что только унаследованный базовый класс может предоставлять методы, в то время как другие могут только объявлять их и называть «класс» первым и "интерфейс" других.

Но, говоря языком, между ними нет концептуального различия.

1

Как вы сказали, интерфейс в 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 
    }; 
0

Рассмотрим это таким образом: Есть два типа функций

  1. Concrete - тот, который имеет некоторый код, и на самом деле выполняет задачу.
  2. Virtual -Это не имеет никакого кода и переопределяется каким-либо другим конкретным классом в соответствии с локальной потребностью этого класса. Виртуальная функция задается путем размещения в объявлении «= 0».

Теперь interface пустая оболочка, в которой все функции должны быть виртуальными functions.It это просто pattern.It предназначен быть полностью изменен программистом путем переопределения его виртуальные функции.

Но, abstract class - это класс, который частично реализован программистом. То есть он должен иметь хотя бы одну виртуальную функцию, но не обязательно все.