что такое интерфейс и методы, абстракция и инкапсуляция в C ++ - PullRequest
0 голосов
/ 22 января 2010

Я смущен такими понятиями, когда обсуждаю со своим другом.

Мнение моего друга:

1) абстракция о чисто виртуальной функции.

2) интерфейс не является функциями-членами, но интерфейс является чисто виртуальными функциями.

Я обнаружил, что в учебнике по С ++ интерфейсом являются те операции, которые поддерживает тип данных, поэтому функции-члены являются интерфейсом.

Мои мнения

1) абстракция - это определение интерфейса и реализации;

2) функции-члены являются интерфейсами.

Так кто-нибудь мог бы разъяснить мне эти понятия?

1) разница между абстракцией, абстрактным типом данных и абстрактным классом.

2) разница между интерфейсом и функциями-членами.

3) разница между абстракцией и инкапсуляцией.

Ответы [ 4 ]

5 голосов
/ 22 января 2010

Я думаю, что ваша главная проблема в том, что вы и ваш друг используете два разных определения слова «интерфейс», так что вы оба правы по-разному.

Вы используете «интерфейс» в повседневном смысле «определенного способа взаимодействия с чем-либо», например, «интерфейс между моим компьютером и клавиатурой - USB» или «интерфейс между пылесосом и стеной сила это розетка ". В этом смысле, да, методы (даже конкретные) являются интерфейсами, поскольку они определяют способ взаимодействия с объектом. Это не означает, что это не применимо к программному обеспечению - это означает «интерфейс», используемый в термине «Интерфейс прикладного программирования (API)».

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

"Абстракция", с другой стороны, касается многих вещей, и снова вы оба правы. Абстракция в общем смысле означает возможность сосредоточиться на концепциях более высокого уровня, а не на деталях более низкого уровня. Инкапсуляция - это тип абстракции, потому что ее цель - скрыть детали реализации методов класса; реализация может измениться без изменения определения класса. Чистые виртуальные функции («интерфейсы» в смысле OO-жаргона) представляют собой еще один тип абстракции, поскольку при правильном использовании они могут скрывать не только реализацию, но и истинный базовый тип объекта; используемый тип может изменяться, если оба типа реализуют один и тот же интерфейс.

3 голосов
/ 22 января 2010

Одни и те же термины могут использоваться для разных вещей, что и происходит здесь.

«Абстрактный» в C ++ означает метод, который вообще не имеет реализации (вы не можете создать экземпляр объекта с элементами Abstract.)

«Абстракция» - это просто понятие «моделирование». Моделирование упрощает внешний вид чего-то сложного, игнорируя некоторые детали. В программировании вы хотите разбить операции и концепции на компоненты, а для каждого компонента абстрагировать детали от внешних компонентов, которые не влияют на работу текущего компонента.

Программный «Интерфейс» - это способ реализации «Абстракции». Вместо того, чтобы иметь весь исходный код и внутренние операции компонента, вы видите только те операции, которые соответствуют тому, как вы используете объект. «Интерфейс» в C ++ реализован путем пометки всех методов класса как «абстрактных» (также называемых «чисто виртуальными»). Это делается путем помещения '= 0' после объявления метода, но перед точкой с запятой. Метод должен быть помечен как «виртуальный», чтобы это было допустимо.

Другими словами, абстрактный класс C ++ - это класс, в котором есть хотя бы один чисто виртуальный метод, а интерфейс реализован в C ++, делая все функции-члены чисто виртуальными.

Инкапсуляция - это нечеткий термин, но для меня это означает технику реализации абстракции. Это означает «сокрытие информации». Вы скрываете внутренние детали того, как объект выполняет свой «контракт». Контракт выражается через интерфейсы, что, на мой взгляд, является более мощной формой абстракции. Любой класс C ++ с защищенными или закрытыми членами использует инкапсуляцию, но класс, реализующий только чисто виртуальные методы, описывает контракт, обещая предоставить определенные сервисы, для которых вам нужно абсолютно ничего не знать о том, как они реализованы, или о других сервисах, которые тот же объект может воплощать в жизнь.

Один и тот же объект может заполнять несколько контрактов, и, предоставляя несколько непересекающихся интерфейсов, он не заставляет клиентов знать обо всех вспомогательных функциях объекта. Например, объект может сообщать вам остаток на банковском счете, а также может быть сериализован / десериализован в базу данных. Вы могли бы просто иметь один класс со всеми этими операциями, представленными как функции-члены. Я предпочитаю определять два интерфейса: «IDatabaseSerializable» и «IBankAccount», и помещать соответствующие операции в соответствующие интерфейсы и наследовать оба интерфейса в моем классе реализации. Затем клиенты, которые заботятся только о банковских балансах, видят как можно меньше дополнительной информации, а база данных видит только те операции, которые ей нужны.

1 голос
/ 22 января 2010
  1. Абстракция означает, что кто-то может использовать ваш код, не зная деталей реализации. Сложность в том, что вещи, которые являются деталями реализации в одном контексте, могут не быть в других. Абстрактный тип данных - это тип данных, который не может быть создан и описывает только атрибуты его подтипов. Абстрактный класс - это просто абстрактный тип данных и класс.

  2. Интерфейс может быть неявно определен набором функций-членов (хотя для полезной абстракции они должны быть, по крайней мере, виртуальными, так что существует более одной возможной реализации интерфейса). Он также может быть определен явно как класс только с чисто виртуальными функциями (в C ++) или interface (в Java, C # и D).

  3. Абстракция - это когда не нужно знать о деталях реализации чего-либо. Инкапсуляция - это когда вы не можете узнать о них. Например, класс, который в остальном хорошо спроектирован с точки зрения ОО, но не заботится о том, чтобы установить для своих переменных-членов значение private, все еще может быть полезной абстракцией, но он не инкапсулирован.

1 голос
/ 22 января 2010

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

Другой подход к интерфейсам в C ++ - это общий код (то есть шаблоны), где вы часто не ожидаете какого-либо конкретного типа - вместо этого вы ожидаете, что тип будет иметь определенные функции-члены с определенной семантикой - если это не так получит ошибку компиляции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...