概念与接口有何不同?

时间:2009-07-25 22:14:44

标签: c++ templates generics c++11 c++-concepts

概念(即最近从C ++ 0x标准中删除的那些)与Java等语言中的接口有何不同?

5 个答案:

答案 0 :(得分:24)

概念用于编译时多态,这意味着参数通用代码。接口用于运行时多态。

您必须在实施Concept时实现接口。不同之处在于您不必明确表示您正在实施Concept。如果所需的接口匹配则没有问题。在接口的情况下,即使你实现了所有所需的功能,你也要兴奋地说你正在实现它!


我会尽力澄清我的答案:)

想象一下,您正在设计一个容器,该容器接受具有 size 成员函数的任何类型。我们将Concept形式化并称之为HasSize,当然我们应该在其他地方定义它,但这不再是一个例子。

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

然后,想象一下,我们正在创建容器的实例,我们称之为 myShapes ,Shape是基类,它定义大小会员功能。 Square和Circle就是它的孩子。如果Shape没有定义大小,那么应该产生错误。

Container<Shape> myShapes;

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

我希望你看到可以在编译时 HasSize 检查Shape,没有理由在运行时进行检查。与 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.
}

在这个函数中,你无法知道在圆形或正方形运行时会传递什么!

它们是用于类似工作的两个工具,虽然Interface或者你称之为 - 在运行时可以完成与Concepts相同的工作但是你会失去编译时检查和优化的所有好处!

答案 1 :(得分:7)

概念类似于模板的类型(类):它仅用于语言的泛型编程方。

这样,它并不意味着替换接口类(假设您的意思是抽象类或C#或Java接口的其他C ++等效实现),因为它仅用于检查模板参数中使用的类型以匹配特定要求。 类型检查仅在编译时完成,就像所有模板代码生成一样,而接口类对运行时执行有影响。

答案 2 :(得分:2)

从观点来看,这或多或少是不同的。虽然接口(如在C#中)被指定类似于基类,但是概念也可以自动匹配(类似于Python中的duck-typing)。目前还不清楚C ++将支持哪种级别的自动概念匹配,这也是他们放弃它的原因之一。

答案 3 :(得分:1)

概念是隐式接口。在C#或Java中,类必须显式实现接口,而在C ++中,只要符合概念的约束,类就是概念的一部分。

您将在C ++中而不是在Java或C#中看到概念的原因是因为C ++并没有真正拥有&#34;接口&#34;。相反,您可以使用多个继承和抽象的无成员基类来模拟接口。这些都是一种破解,可能是一个令人头痛的问题(例如虚拟继承和The Diamond Problem)。接口在OOP和多态性中起着关键作用,到目前为止,这个角色在C ++中还没有充分实现。概念就是这个问题的答案。

答案 4 :(得分:0)

为了保持简单,根据我的理解。

  • 概念是对类型(即类或结构)或方法的模板参数的约束

  • 接口是类型(即类或结构)必须实现的契约。