gpt4 book ai didi

c++ - 接口(interface),绝对就是纯虚函数,或者...?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:31 25 4
gpt4 key购买 nike

每次我读到接口(interface)时,都会提到它从来没有任何数据成员或实现。

但是当我看到带有接口(interface)的代码时,它们两者都有。

class IInterface
{
public:
IInterface(){}
virtual ~IInterface(){}
int getInt(){ return m_int; }
virtual void Boo() = 0;
int m_int;
};

class cInterface : public IInterface
{
public:
virtual void Boo()
{
printf( "defined in .cpp for readability\n" );
};
};

class cFoo : public cInterface
{
};

(几乎)我从来没有在源文件中看到它们,只有标题。

这个术语的使用有多严格?如果以上不是接口(interface),它是如何被调用的?

作为IInterface*使用时是否体现了cInterface/cFoo的用法?

...
cFoo foo;
IInterface* object = &foo;
object->Boo();
...

最佳答案

C++ 在其语言定义中没有接口(interface)类型的正式定义,也没有办法强制编写纯抽象类。然而,这个概念肯定存在于软件工程中,并且可以追溯到很久以前。 Corba 和 COM 是典型的例子。通用技术称为“基于接口(interface)的编程”。另一个流行的标签是“按契约(Contract)设计”。某些 C++ 编译器具有支持它们的语言扩展,例如 MSVC 中的 __interface。从其他方面来看,它仍然是一个普通类,编译器只是加强了纯度。

一个具体的例子是使用一个接口(interface)来定义一个实际存在于另一个运行时环境中的对象的代理。就像在世界各地的机器上一样。代理是接口(interface)的本地实现,具有通过网络发送参数值的方法。电线的另一端有一个带有实际方法的 stub 。如果对象实际上是在本地创建的,那么客户端代码将不需要任何更改的主要优点是,它仍然使用相同的接口(interface)。换句话说,实现是不可见的,不会影响代码。在这种情况下,您提供的示例将不能正确运行,远程对象的 m_int 成员将没有正确的值。它不是一个接口(interface),只是一个抽象类。

接口(interface)在不实现多重继承的语言中尤为重要。由于菱形继承(钻石问题),MI 很难。但那是一个实现的继承问题,继承多个接口(interface)没有问题。这种语言必须解决的唯一小问题是当两个或多个继承的接口(interface)具有具有相同名称和签名的方法时的歧义。但这可以通过为语言提供一种方法来指定正在实现的特定接口(interface)方法来轻松解决。就像 C# 中的“显式接口(interface)实现”语法一样。不确定 Java 是做什么的。

另一个既实用又麻烦的方面是它是设计工具,即“按契约(Contract)设计”的角度。如果你在一个有很多开发人员的大型项目上工作,那么你往往会得到很多接口(interface)。它们包含了建筑师发出的“这是我们应该做的”。但是没有任何“这就是我所做的”,尤其是在项目的早期。真正的错误是实现错误,很少是接口(interface)错误。一个真正让多个程序员同时工作的优秀工具。但是,要使项目的基础稳固并锁定,这样您就可以在此基础上进行构建,这很糟糕。不是 Bjarne 的工作方式。

关于c++ - 接口(interface),绝对就是纯虚函数,或者...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11917454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com