Подтвердить что ты не робот

Как понятия отличаются от интерфейсов?

Как понятия (например, те, что недавно удалены из стандарта С++ 0x) отличаются от интерфейсов на таких языках, как Java?

4b9b3361

Ответ 1

Понятия предназначены для полиморфизма времени компиляции, что означает параметрический общий код. Интерфейсы предназначены для полиморфизма во время выполнения.

Вы должны реализовать интерфейс при реализации Концепции. Разница в том, что вам не нужно явно указывать, что вы реализуете концепцию. Если соответствующий интерфейс согласован, то проблем нет. В случае интерфейсов, даже если вы внедрили all требуемые функции, вы должны возбудить, что вы его реализуете!


Я попытаюсь уточнить свой ответ:)

Представьте, что вы проектируете контейнер, который принимает любой тип, который имеет функцию члена размер. Мы формализуем концепцию и называем ее HasSize, конечно, мы должны определить ее в другом месте, но это не более пример.

template <class HasSize>
class Container
{
  HasSize[10]; // just an example don't take it seriously :)
 // elements MUST have size member function!
};

Затем представьте, что мы создаем экземпляр нашего Контейнера и называем его myShapes, Shape является базовым классом и определяет размер. > функция-член. Квадрат и Круг - просто дети. Если форма не определяла размер, тогда необходимо создать ошибку.

Container<Shape> myShapes;

if(/* some condition*/)
    myShapes.add(Square());
else
    myShapes.add(Circle());

Надеюсь, вы увидите, что во время компиляции Shape можно проверить на HasSize, нет никаких оснований делать проверку во время выполнения. В отличие от элементов myShapes, мы могли бы определить функцию, которая ими управляет:

void doSomething(Shape* shape)
{
    if(/* shape is a Circle*/)
        // cast then do something with the circle.
    else if( /* shape is a Square */)
        // cast then do something with the square.
}

В этой функции вы не можете знать, что будет передано до времени выполнения Circle или Square!

Это два инструмента для аналогичной работы, хотя интерфейс или то, что вы им называете, может выполнять почти ту же работу Concepts во время выполнения, но вы теряете все преимущества проверки времени и оптимизации времени компиляции.

Ответ 2

Концепции нравятся типам (классам) для шаблонов: это для общей части программирования только языка.

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

Ответ 3

Это более или менее различие в точке зрения. Хотя интерфейс (как и в С#) указан аналогично базовому классу, концепция также может быть автоматически сопоставлена ​​(аналогично утиновому типу в Python). До сих пор неясно, на каком уровне С++ будет поддерживать автоматическое сопоставление понятий, что является одной из причин, по которым они отказались от него.

Ответ 4

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

Причина, по которой вы увидите концепции на С++, а не на Java или С#, состоит в том, что С++ на самом деле не имеет "интерфейсов". Вместо этого вы можете имитировать интерфейс, используя множественные наследования и абстрактные базовые классы без элементов. Это несколько хак и может быть головной болью для работы (например, виртуальное наследование и The Diamond Problem). Интерфейсы играют критическую роль в ООП и полиморфизме, и эта роль до сих пор не была адекватно выполнена на C++. Концепции - это ответ на эту проблему.