首先明晰一下“面向对象”概念,这个当初不好的翻译误导了很多人,英文叫“Object-Oriented”,什么意思呢就是“以客观事物(object)的形式来组织程序”。
就这么简单,比如客观上我们观察到 人 为一个个体,那么我们在组织程序的时候就按照 人 来组织实体对象,即声明一个 Person 的类来使用。
我们为什么需要面向对象,有人说我全部函数编程也能实现what what, 原因是这样的 “当软件的复杂度超出了人们所能掌控的尺度的时候,软件就无法在进化和维护下去了”,你面对上万个函数,该一个地方而动全身的时候,你已经无法在修改程序,应对变化。所以“面向对象” 解决了人的感官只能应对有限复杂度的问题,解决了软件危机。
ok ,回答对C# 的争论,有人的观点依据是有专家说了 C++ 不行了,因为C++的面向对象特性没什么意义,还不如C 来的直接。 当然这个观点在某个角度是正确的, 面向对象对机器来说没有任何意义,CPU 都是顺序执行,所以在人能应对的复杂度的范围内,把程序组织成 人能看懂 就不如把程序组织成 机器能看懂,性能好些,因为毕竟中间有个翻译问题。
当然说到这,答案也就出来了,那要是复杂度超出这个范围呢,我们必然必须靠向 “人能看懂”,不然就是 软件危机。所以“面向对象”是我们发明的银弹。光谈性能,不了解为什么它存在的理由,是一叶障目。
ok,回倒题目,再说说事件和接口。
事件是什么? 事件背后的哲学是“晚绑定”机制,提供了一个占位符,当我们使用组件或类的时候,在这个占位符中插入我们想要的逻辑。(委托一样,事件是特殊的委托)。不然我们如何在一大串逻辑的中间,随意定制客户化的逻辑呢?
事件当然是对象行为,多么的生活化啊, 发生的故事我们就要有相应的行动,但每个人的行动不是一样的,“鸡寒上树,鸭寒入水”一句话就说透了事件。
如果你只看到了观察者模式的话,说明你看问题还在表面。
那么接口呢,接口背后的逻辑是:“契约”,即“我必须以特定的形式(接口规定的)访问使用对象,你必须履行契约封装成我想要的形式,我才能使用你”。呵呵,这样简单说的话,接口也可以理解为“占位符”,但和上面的占位符区别大了,那就是“实现接口的对象都可以占接口占的位置”。
一个是实体的占位符,一个是一串逻辑流程处理中的占位符,两者要解决问题的上下文如此不同,又怎呢互相替代呢?
如果你看到表面的设计模式,就像把人定义为 “碳水化合物”一样,you miss too much.
最后补充: 将两者放一起谈是因为院子里最近比较热的文章说接口可以替代事件, 现在想想他的意思可能是 观察者的推模式 中使用接口替代事件,我又研究了一下这个问题,最后发现原来问题归结到 链表还数组的性能的时候,我觉得争论实在是没有必要了.
当然此文的观点和总结的知识点还是非常有用的,尤其是对于真正的OO架构师来说,如果没有对着连个概念这样的认识,无法说懂OO设计。
再补充一下,事件就是委托的特殊形式。事件特殊于委托之处为,无返回值,必须有2个固定参数,必须为多点委托,即+= 而不是 =
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?