为什么函数指针不被认为是面向对象的?

P.B*_*key 23 .net c# language-agnostic oop

在C#语言规范中,它明确指出:

委托类似于在其他一些语言中找到的函数指针的概念,但与函数指针不同,委托是面向对象的,类型安全的.

我理解委托需要比指针更灵活,因为.NET会移动内存.这是我所知道的唯一区别,但我不确定这会如何将代表转变为OO概念......?

是什么让函数指针不面向对象?指针和函数指针是否等效?

Eri*_*ert 32

嗯,维基百科说"面向对象"意味着使用"数据抽象,封装,消息传递,模块化,多态和继承等功能".缺乏更好的定义,让我们继续.

函数指针不包含数据,它们不封装实现细节,它们既不发送也不接收消息,它们不是模块化的,它们通常不以多态方式使用(尽管我认为它们在理论上可以是协变的和逆变的.它们的返回和形式参数类型,因为委托现在在C#4中,并且它们不参与继承层次结构.他们不是自我描述的; 你不能问一个函数指针的类型,因为它没有.

相比之下,代表们捕获数据 - 他们抓住接收器.它们支持消息传递,您可以通过调用其ToString或GetType或Invoke或BeginInvoke方法来"告知"委托,以告诉它执行某些操作,并使用结果"返回"消息.如果您选择,则可以将委托类型限制为某些可访问性域.它们是具有元数据的自描述对象,并​​且在运行时知道它们自己的类型.他们可以与其他代表合并.它们可以多态地用作System.MulticastDelegate或System.Delegate,它们是从中继承的类型.并且它们可以多态地使用,因为在C#4委托类型中它们的返回和参数类型可能是协变的和逆变的.

  • 在C++中,函数执行一些OO操作,尽管我同意不足以作为OO功能.例如,他们*做*抽象数据,因为你可以有`static`局部变量,但委托以更好的方式存储数据,因为你可以在运行时多次实例化"相同"委托,并获得其数据的不同副本.C++函数指针确实有一个类型,但它们没有查询动态类型的方法.在"消息"意义上的"方法调用"意义上,它们接受一条消息 - "operator()".等等. (2认同)