gpt4 book ai didi

c - Windows API 是面向对象的框架吗?

转载 作者:行者123 更新时间:2023-11-30 14:47:20 25 4
gpt4 key购买 nike

当你在Windows API中创建一个控件对象(HWND)时,你不能直接访问该控件对象的成员,只能通过特定的函数来访问它,这是一个OOP的特点。

另外,Windows API支持多态性,例如我可以有以下功能:

void setHwndText(HWND hwnd)
{
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)"Hello World");
}

上述函数可以更改多种类型对象的文本,而不仅仅是一种类型,例如,它可以更改窗口的标题、编辑控件的文本和按钮控件的标题。

我不知道 Windows API 是否支持继承,但即使不支持,我认为 OOP 中继承的主要目的是允许多态性,正如我所展示的,Windows API 确实支持多态性。

这是否意味着 Windows API 可以被视为面向对象的框架?

最佳答案

Windows 中的文件和窗口句柄类似于 Unix 中的流、文件描述符、C 标准库中的 FILE 指针等。将不透明句柄传递给库函数与使用隐式 this 指针调用成员函数之间存在相似之处。

另一个更接近的例子是使用 RegisterClassEx() 注册的窗口类。这是句柄式 API 和大家都认为“面向对象”的 COM 框架之间的过渡:您注册一个包含函数指针的结构,这很像虚拟函数表中的成员函数指针。您没有任何类型的类层次结构或要实现的接口(interface)选择。您不会覆盖默认实现,也不会在覆盖其他方法的同时继承某些方法。您只是传递一个包含函数指针的结构。

区别可能会变得模糊。如果你看看 Nicholas Wirth 设计的语言家族,你会发现 Pascal 是一种受 Algol 启发的传统结构化命令式语言,而 Modula、Modula-2 和 Oberon 则在面向对象的方向上进行了实验性的发展。当时,这些中间语言被称为“基于对象的”。到了 90 年代中期,Delphi 和 Object Pascal 等语言都适应了面向对象的范式。

然而,与 70 年代末类似的库通常不被称为“面向对象”。特别是,它们没有具有继承的类层次结构。客户端应用程序本身也不管理实例,而是自动创建和销毁实例以防止内存泄漏。

当 C API 确实执行类似于多态性和继承的操作时,例如能够提供指向回调函数的指针,它会以不同的方式执行。在传统的面向对象语言中,您将静态定义覆盖虚拟成员函数的窗口的派生类,而不提供任意函数指针来回调(尽管与面向对象的访问者模式有一些相似之处)。

类似名称的“窗口类”之类的东西只是回调。尽管多态对象的所有实现都构建在包含函数指针的结构之上,但并非所有使用回调函数的程序都是面向对象的。一个更接近面向对象编程的示例是 Winsock 2 如何使套接字描述符成为一种特殊类型的文件描述符,可以将其传递给内核文件函数(通过强制转换)。如果我们有一个面向对象的 API,将成员函数重命名为全局函数,使隐式 this 指针成为显式参数,然后将其转换为不透明句柄,那么它仍然主要是面向对象的。它唯一会失去的是静态类型安全和封装。更类似于 OOP 的是组件对象模型及其后继者,其中对象实现了接口(interface)。

Windows 已有多种“面向对象”的 API,包括 Microsoft 基础类、Borland 的对象 Windows 库、对象链接和嵌入、较新的组件对象模型和公共(public)语言运行时库,以及甚至较新的 Windows 运行时。

关于c - Windows API 是面向对象的框架吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388630/

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