在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可以视为面向对象的框架?
答案 0 :(得分:1)
Windows中的文件和窗口句柄类似于流,Unix中的文件描述符,C标准库中的FILE
指针等等。将不透明的句柄传递给库函数与使用隐式this
指针调用成员函数之间有相似之处。
另一个更接近的示例是您向RegisterClassEx()
注册的窗口类。这是句柄样式的API和COM之类的框架之间的过渡,每个人都同意它是“面向对象的”:您注册了一个包含函数指针的结构,这很像虚拟函数表中的成员函数指针。您所没有的是任何种类的类层次结构或选择要实现的接口。您不会覆盖默认实现,也不会继承某些方法而覆盖其他方法。您只是传递了一个包含函数指针的结构。
区别可能变得模糊。如果您看一下Nicholas Wirth设计的语言家族,Pascal是受Algol启发的传统结构化,命令式语言,而Modula,Modula-2和Oberon则朝着面向对象的方向实验性地发展。当时,这些中间语言被称为“基于对象的”。到90年代中期,诸如Delphi和Object Pascal之类的语言都适用于面向对象的范例。
但是,类似于70年代末期的库通常不称为“面向对象”。特别是,它们没有具有继承关系的类层次结构。客户端应用程序本身也不管理实例,它们的创建和销毁操作自动化以防止内存泄漏。
当C API执行类似于多态性和继承的操作(例如能够提供指向回调函数的指针)时,它会以不同的方式进行操作。在传统的面向对象语言中,您将静态定义窗口的派生类,该类重写虚拟成员函数,而不提供任意函数指针来进行回调(尽管与面向对象的访问者模式有些相似)。 / p>
类似名称的“窗口类”之类的东西只是回调。即使多态对象的所有实现都建立在包含函数指针的结构之上,但并非所有使用回调函数的程序都是面向对象的。一个更接近于面向对象编程的示例是Winsock 2如何使套接字描述符成为一种特殊类型的文件描述符,该描述符可以传递给内核文件函数(使用强制转换)。如果我们有一个面向对象的API,将成员函数重命名为全局函数,将隐式this
指针作为显式参数,然后将其强制转换为不透明的句柄,则它仍然大部分是面向对象的。它唯一会丢失的是静态类型的安全性和封装。甚至更像OOP的是,我肯定将其称为OOP,是组件对象模型及其后继对象,其中对象实现接口。
有几种Windows的“面向对象” API,包括Microsoft基础类,Borland的对象Windows库,对象链接和嵌入,更新的组件对象模型和公共语言运行时库,以及更新的Windows运行时。