dte*_*ech 6 oop polymorphism procedural-programming
假设我们有一个包含不同元素的绘图程序,例如圆形,矩形,三角形等.不同种类的对象都需要类似的功能,比如draw()展示自己.
我想知道程序员如何处理现在通常通过多态解决的问题,即通过一组不相同的元素并调用不同对象的通用功能.
想到的一种方法是使用一个带有函数指针的结构,该函数指针指向适当的函数(或函数指针数组中的索引)以及指向实际实例的void指针,并将指针转换为正确的类型在功能中.但这就是我 - 一个对这个问题毫无头绪的人会这样做.
我确实意识到这可能是一个愚蠢的问题,但由于我在"过去"的日子里没有出现过,我真的很想知道这个问题是如何解决的.在程序编程中使用了什么样的方法并且它具有性能优势,因为我们都知道多态性即使在像C++这样的快速语言中也有开销,这是由于虚方法查找.
小智 0
在 C 等过程语言中,可以通过draw()为每个自定义数据类型(可能表示为结构体)定义函数的单独实现来解决这个问题。任何常见功能都将被分解为一个单独的函数,该函数对每个结构体的共享元素进行操作(例如对象中心的 x 和 y 坐标,这将出现在每个结构体中)。从代码和功能的角度来看,这与利用多态性的 OOP 布局没有太大区别,在 OOP 布局中您仍然必须实现共享draw()在基类中实现共享方法并在特定子类中重写它。对于过程语言,我们只是不会将这些函数定义拆分为单独的“对象”。
有一些奇特的方法可以从过程语言中获得类似对象的行为,例如联合类型或带有额外布尔值的单一整体类型来确定是否正在使用特定元素。这将允许您编写一个draw()函数,该函数可以根据启用的元素执行逻辑切换。在实践中,我唯一看到的大部分情况是在基于 CORBA 的系统中,其中用 C 编写的程序必须模仿通过 IDL 传播的 OOP 语言的某些行为(即,将 Java 对象转换为构造函数)。可以解码为 C 风格的结构)。
至于C++、Java等语言中虚方法查找的开销,这是面向对象语言中无法完全避免的。final通过正确使用关键字(允许编译器/JVM 优化方法查找表)可以很好地缓解这种情况。