一组只做一个词但名称不同的函数(如atoi
、atol
、atoll
等)理论上称为多态函数吗?
例如,我有一个函数swap
,它需要对不同类型的数据类型进行操作。因此,我有一个函数/操作,我有不同的实现,但不幸的是,由于该语言不支持使用相同的函数名,为了获得这样的功能,我需要制作变体swap_i
、swap_l
、swap_f
、swap_str
等,并且必须根据操作数手动调用它们。
在设计代码时,可以将其设计为一个函数,具有不同的实现,这些实现根据操作数进行调用。但在这种情况下,程序员而不是编译器需要对函数进行静态绑定。如果程序员用C++实现它,那么设计将是相同的(因为他/她遵循了OOD方法),但在这种情况下,静态绑定可以由编译器完成,而不会打扰用户。
现在,如果在设计方法中swap
是一个多态函数,那么C和C++设计实现中的这种差异会产生影响吗?这样我们就不能称这样的C实现为非多态的,而C++实现为多态的?
第1版:
另一个例子:
假设我们发送一个包含不同可能数据类型的并集,以及一个用变量包装的结构,该变量指示要使用并集的哪个组件。那么我们只能使用一个没有变体的函数名swap
。在我们接收到函数中的结构后,我们可以根据联合中活动的数据类型在内部进行操作
struct _generic {
int type;
union {
int a;
float b;
char c;
} component;
} variable;
swap (struct _generic var2, struct _generic var1)
{
if (var1.type == INTEGER)
{
/* code for integer */
}
else if (var1.type == FLOAT)
{
/* code for float */
}
.
.
.
}
在这种情况下,我们使用另一种方式。
还要注意像printf
中的省略号运算符...
,这样我们也可以获得一些内置特性。
要点是,C语言不提供OOD的直接实现,但我们可以在C实现上使用OOD术语来实现吗?如果它是按照面向对象的设计来设计的?
假设差异是两个字符、三个字符还是十个字符?不同的函数会是多态的吗?我会说,不,他们不会。那么一个角色有什么特别之处呢?
它不是多态的,因为swap
函数变体不能有多个签名。多态性的全部目的是限制程序员所做的维护,认为它只是过载而由人类完成肯定是错误的想法。诀窍就在术语"poly"one_answers"morphism"中。这些函数都没有多重性——它们只是碰巧以相似的名称提供了相似的功能,而且它们之间根本没有变形,所以它们肯定不是多态的。
我认为你在混合不同的概念和语言,这会导致混乱。在C++中,您所称的多态函数通常被称为重载函数:有不同的函数共享一个名称。多态性通常是指重写基类中函数行为的特性。函数本身将具有一组固定的名称、参数和返回类型(根据语言的不同,协变返回类型或反变参数有一定的空间)。
至于把C中的手动实现称为重载是否合适,我认为不合适。如果你扩展并滥用这个术语,你可以让它变得合适,以与编程面向对象汇编程序完全相同的方式(有些汇编程序允许您定义结构,您可以将地址添加到其他代码符号中作为结构的属性……这是否使其成为面向对象的汇编程序?)
C不表现出多态性。http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29关于多态性的信息。对于被认为是远程多态的C函数,所有函数都必须具有相同的名称,但操作不同的数据类型(也称为函数重载)。
在我看来,这并没有错,因为多态性和其他面向对象的术语不是依赖于语言的,而是一个概念。现在,不同的语言提供了不同的功能,通过这些功能,对象模型的实现要容易得多,而有些功能只是可能的,而在其他语言中是不可能的。
如果用OOD方法对一个问题进行建模,并遵循相同的模型用C和C++实现,保持方法相同,其中差异仅来自语言的有限特征集,然后对它们进行编译,然后两者都生成汇编代码。多态函数的C++输出在转换为asm后不再是多态的。
不同之处在于,C没有提供像在C++或其他OOP语言中那样容易实现OOD的功能。