概念(即最近从C ++ 0x标准中删除的那些)与Java等语言中的接口有何不同?
答案 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)
为了保持简单,根据我的理解。
概念是对类型(即类或结构)或方法的模板参数的约束
接口是类型(即类或结构)必须实现的契约。