我的面向对象程序观

编程范式[paradigm] 编程范式也许是学习任何一门编程语言时要理解的最重要的术语。 阅读详情

/**
* Title:        我的面向对象程序观
* Description:  描述我对面向对象的一些理解,思想上并不成熟,文章随时都在更新,希望大家都来参与讨论
* Copyright:    Copyright (c) 2001
* Company:      Matrixfox
* @author 莫特探员
* @version 本文章还在继续更新中。
*/

我的面向对象程序观

1)面向对象概念的一些误解

“面向对象”是一个如今被人叫烂的词汇,就像去年人们都喜欢把自己的公司打上“.com”的标记一样。其实有多少人能真正理解这个词汇呢,很难说。我喜欢这样来比喻人们对“对象”一词的滥用。“对象”就好比人们经常说的“酷”和“爽”,很多人并不仔细考虑这两个词的差别,在很多情况下他们是通用的,“酷”和“爽”通常表达“心情不错”的意思,你可以在你玩的高兴的时候,大声的叫嚷“太酷了,太爽了”,这个时候两个词汇是通用的。但是你可以说“这个人很酷啊”,但是你不能说“这个人很爽啊”。人们对“对象”这个词汇的滥用就发生在这里,“面向对象”和“基于对象”就好比“酷”和“爽”,这是两个不同的概念,但是人们通常将这两个词汇混为一谈,一律用“面向对象”来表达。常见的错误可以在此列举一些:

1)有个人兴高采烈的和你说“我不喜欢 flash 4 的脚本语言,flash 5 版本的 action script 采用了新的面向对象的“.”语法,写起来很舒服。我现在一直用 flash 5 来做东西。”(同样的话语也发生在 director 的 lingo 脚本语言中)

2)visual basic 采用了面向对象的属性和方法,比起过去的 basic 语言有了很大的提高。

3)javascript 是面向对象的。

等等。

通常听到类似的话,你都要认真审视说话之人,分析他说的话。可以肯定一点,他并非真正懂得什么是面向对象的思想。很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)却一不可,通常“基于对象”使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点,而“多态”是表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。


2)java 比 C++  在贯彻面向对象的思想方面更加彻底。
我最近上的学习班的老师对我说:“C++ 是打着面向对象的幌子,干着过程编程的勾当”,这句话我非常的赞同,而且我一直以来也是这么认为的。但是仔细听他讲解后,我才发现,我是只是理解了这句话前两层的意思。但是还有一层意思我没有理解。你可能要问,“难道 C++ 不是面向对象的吗?”。事实上 C++ 是真正的面向对象编程语言。但是它也是过程编程语言。为什么怎么说呢, C++ 的产生不但考虑了面向对象的特性,而且也更多的考虑了对 C 语言的向后兼容,使得 C++ 这种杂合语言表现出“过程”和“对象”编程的双重性。你通常既可以继续用 C++ 编译器来编写传统的 C 程序,也可以使用 C ++ 的类库或者编写自己的类来作面向对象编程。这种“两面性”使得人们可以继续保留原有的 C 代码,同时也阻碍了面向对象思想的推广。


举个简单的例子,94 年的时候,我开始学习 C++ ,当时是学习 turbo C++ 自己带的一个叫作 turbo vision 的类库来做项目。我的同学也用 turbo C++ ,但是他一点也没有学习过 C++ 这个语言,他只是用 turbo c++ 编译器来重新编译他以前用 turbo c 写的程序,然后他自豪的对我说:“瞧,我用 c++ 做的东西”,好像意思是说“我用 c++ 开发项目了”,在那个 c 比 pascal 高档, pascal 比 foxbase 高档的年代里, C++ 的标签绝对是个很"酷"的标志。我其实很清楚他的行为。这就是“C++ 是打着面向对象的幌子,干着过程编程的勾当”的第一重意思,也就是说, C++ 编译器对 C 程序的兼容性造成了最底层的“过程勾当”。在国内有很长一段时间,人们都是在用 C++ 编译器做 C 编程。 我当时在想,比起我那个同学,我才是真正懂得面向对象的人。 我学习了 C++ 语言,我懂得封装,继承和多态,我学习了 turbo vision 的类库,我派生了 turbo vision 的类库并编写了自己的类,所以我是懂得面向对象的。从某种意义上说,我这么想是对的。但是从面向对象程序员的分类来说,我又不完全懂得面向对象的思想。从事面向对象编程的人按照分工来说,可以分为“类库的创建者”和“类库的使用者”,通常创建类库的人才是真正懂得面向对象思想的人,他们创建类库供给那些“客户程序员”来使用,他们从头开始制作类库,他们进行面向对象的分析,设计,实现的全过程。当学习完 C++ 后,我的第一个感觉是,从头创建一个类库真是很麻烦的事情,通常用 C 过程编程很容易实现的功能,你必须按照类的思想来从新建立对象,但是一旦类库建立好后,使用类库和派生类,以及维护代码都是非常舒服的事情。使用类库的人并不都是具备了面向对象思想的人,通常知道如何继承和派生新对象就可以使用类库了,然而我们的思维并没有真正的转过来,使用类库只是在形式上是面向对象,而实质上只是库函数的一种扩展。这就是我理解的“C++ 是打着面向对象的幌子,干着过程编程的勾当”的第二重意思,实际上用 C++ 编程的人,大部分不自己创建类,而是使用类库,这样就造成了他们把类库作为一种高级的库函数库来理解,并没有真正理解面向对象的思想。


C++ 的面向对象的思想推广很慢,直到 MFC ,OWL ,VCL 这样的类库出来以后,人们才渐渐的接受了一些面向对象的思想。为什么这条面向对象的道路那么难走?我的答案是“因为 C++ 给了我们第二条道路去走过程编程”,当然原因是为了考虑兼容 C 语言,然而正是由于有了第二条老路才使得使得我们不会再去考虑新的面向对象编程思维方式。


直到出现了 Java ,才真正迎来了面向对象的曙光。Java 真正是革命性的东西吗?不是,所有现有的 java 的思想都是继承自其他的语言和技术,没有什么革命的地方,虚拟机的概念早在 20 年前的 UCSD pascal 中就采用了,只是当时的机器速度太慢,虚拟机仿真造成的性能降低对于当时的硬件来说是相当严重的。java 本身的很多东西也借鉴了 C++ 语言,连它的创始人也说,java 是 "C++--" 也就是说 java 去除了 C++ 的一些不太好的地方。所以说 Java 本质上没有什么革命的东西,所以那些对 Java 的赞美之词都是 Sun 公司的宣传伎俩。没有一种语言会长久的存在下去,你很难说你的孩子在二十年后还会继续使用 C++ 或 java,所以我们要抛开这些浮华词汇的背后,找寻真正我们需要学习的东西。否则今天我们大家都是微软的傀儡,明天 Sun 公司起来了,我们就都是 Sun 的傀儡。仔细研究美国电脑技术发展的历史,美国人一向喜欢象第三世界兜售他们的过时技术,而他们始终可以自豪的说,我们将永远领先你们第三世界国家二十年。我们始终在跟在美国人的后面学习他们的东西,这的确让人担忧。我说着说着又跑题了。Java 虽然没有什么真正的革命性的东西,但是 Java 在真正推动面向对象编程思想方面是功不可末的。使用 Java 编程,你无需考虑到向后兼容什么语言的问题,它是重新建立的语言,你在掌握这门语言之前,你必须将自己的编程思想由过程编程彻底转向面向对象编程,因为 每个 Java 程序,本身就是一个类,你编写任何 java 程序,你都不自觉的在构造一个对象模板,没有第二条道路,只能是面向对象编程。( 我非常喜欢 java 将所有类定义和类声明放在一个文件中,而不是象 C++ 那样,cpp 和 .h 文件是分开的。通常刚刚开始学习 java 的人不习惯,不过学习一段时间,你就会体会到它的好处了。), 使用 java 编写程序(我更喜欢说---编写类,而不是程序)的时候,你会必须从一个对象的角度来考虑问题,因为你的程序就是一个类,你必须考虑把哪些东西作为成员变量,哪些作为方法,要生成几个类,哪些变量是成员变量,哪些是静态的变量和方法,等等。通常做完一个项目,你就已经将面向对象的思想运用其中了。之所以说 Java 在面向对象的贯彻方面要比 C++ 彻底,就是因为你只能使用面向对象的方式来编写 java 程序,而 C++ 却可以采用另外一条非面向对象的方式来编写程序。Java 并没有什么真正革命性的东西,它最大的贡献当然是推广面向对象的思想了。

Java 总的来说是降低了继续过程编程的可能性,但是并没有完全消除它。面向对象是一种思想,是我们考虑事情的方法,通常表现为为我们是将问题的解决按照过程方式来解决呢,还是将问题抽象为一个对象来解决它。很多情况下,我们会不知不觉的按照过程方式来解决它,因为我们通常习惯于考虑解决问题的方法,而不是考虑将要解决问题抽象为对象去解决它。很多新的技术使我们更加趋向于过程而非对象的思想。最明显的就是 RAD (快速应用程序开发)可视技术的出现,人们可以通过设置属性和编写事件函数来快速开发应用程序,编写事件函数就是典型的按照过程编程的思想(至少我是这么认为的),试问有多少人能区分VB 和 delphi ,c++ builder ,java 的事件函数编写有什么本质的区别, 后三者都采用了 Delegation (委托模型),在 java 中是通过 anonymous 类(无名类),或者 Adapter 类来实现Delegation,这是一种面向对象的构想,但是 VB 不是,所以这底层的区别都被上层的相似性所抹杀了,使用 jbuilder 编程的时候,我们如果没有仔细研究 java 的 awt.event 编程方式的话,通常也是把它当作普普通通的“类 VB"的编写方式来写程序,而实际分析它在后台所生成的代码,你才能明白这些代码是真正的面向对象的,但是如果你只是简单的把它当作可视编程工具,你是永远不会明白什么是”委托模型“,什么是面向对象编程的。这是我理解的 “C++ 是打着面向对象的幌子,干着过程编程的勾当”第三重意思。无论是 C++ 还是 java 都有可能走过程编程的老路, java 降低的过程编写的可能性,但是如果你没有具备面向对象的编程思想,你还是可能走面向过程的老路的。

(未完待续)
作者Blog:http://blog.youkuaiyun.com/agentmulder/

Numpy快速入门(np)!看这一篇就够了 阅读详情

相关推荐

从数据到特征:基于CAT12的MRI图像预处理实战指南

本文详细介绍了使用CAT12工具进行MRI图像预处理的完整实战流程。从数据获取、环境搭建到核心的AC-PC校正、组织分割、空间标准化与调制,逐步解析如何将原始脑影像数据转化为可用于机器学习的标准化特征图。重点阐述了预处理作为脑影像分析‘生命线’的重要性,并提供了避坑指南与自动化脚本建议,帮助研究者构建高质量的阿尔茨海默症分类模型输入特征。

weixin_29065959的博客 309

面向对象和基于对象的区别

“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)缺一不可,通常“基于对象”使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点,而“多态”是表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法...

weixin_46379551的博客 621

在trae CN中使用conda环境(已解决)

Trae CN 是字节跳动于 2025 年 3 月 3 日发布的国内首个 AI 原生集成开发环境(AI IDE)123。

zwzscnds的博客 6937

面向对象和基于对象区别

面向对象和基于对象的区别是多态,和继承无关。    基于对象仅仅支持了抽象数据类型的功能,继承也不过体现了一种is-a的关系,也是抽象数据类型,只是建立了一个层次体系。但是什么是面向对象呢?就是根据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式。换句话说,也就是虚函数实现的多态。以上观点,在OO设计中已经得到了公认,多态的另一种实现方法是泛型。   “面向对象”和“基于

murongjianke001的专栏 981

工控上位机开发学习路线与核心技术解析

工控上位机开发是工业自动化领域的关键技术,通过计算机软件实现对工业设备的监控与控制。其核心在于掌握工业通信协议(如Modbus、OPC UA)、数据处理算法和可视化开发三大能力。上位机系统需要高效解析设备通信协议,处理实时数据,并提供直观的人机交互界面。在智能制造浪潮下,掌握C#语言和工业协议开发能力成为工程师的核心竞争力。典型应用场景包括生产线监控、设备远程运维等。本文基于工业现场实践经验,详解从协议解析到界面优化的全链路开发要点,特别针对Modbus协议调优、WPF性能优化等高频问题提供解决方案。

weixin_30376083的博客 550

ADK 第一篇 Google Agent Development Kit 简介

是一个灵活且模块化的框架,专为开发和部署AI智能体而设计。虽然ADK针对Gemini和Google生态系统进行了优化,但它与模型无关、与部署环境无关,并兼容其他框架。ADK的核心理念是让智能体开发更接近传统软件开发模式,从而帮助开发者更轻松地构建、部署和编排智能体架构——无论是处理简单任务,还是管理复杂工作流。:利用预置工具、自定义函数、OpenAPI规范或集成现有工具,赋予智能体多样化能力,实现与谷歌生态系统的深度整合。

2501_90353350的博客 3043

基于对象的(Object-based)和面向对象的(Object-oriented)有何联系区别?

基于对象(OB)和面向对象(OO)是两个极易混淆的概念。两者的区别是多态,和继承无关。 面向对象(OB),用纯粹的理论去理解就是,必须具备封装、继承、多态三大特点,缺一不可。可以根据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式(多态)。 基于对象 (OO),仅仅支持抽象数据类型的功能(ADT),通常指的是对数据和操作的封装。无法利用现有的对象模板产生新的对象模型,继而产生新...

Janway-Win 1461

【Burp入门第二篇】Chrome配置BurpSuite代理教程

1、配置Burp代理为127.0.0.1:80802、扩展商店添加插件switchyomega,修改服务器和端口为下图:3、打开代理,选择刚才添加的代理

等风来 8368

java学习笔记——“面向对象”和“基于对象”

1.“面向对象”和“基于对象” 详细理解看前半部分;考试/面试答案直接看后半部分。 1.1 详细理解: 1.1.1 简单对比: 面向对象具有三个特征:封装、继承、多态。 基于对象只有:封装。 所以,两者共同点:封装。不同点:继承、多态。最本质的不同:继承。 1.1.2 详细解释: 首先,解释几个名词: 对象:属性和行为的集合体,即具...

u010571479的博客 557

STM32 IIC电量计LTC2944

LTC2944是一款电池电量计,设计用于端电压为3.6V至60V的多节电池。它测量电池充电和放电、电池电压、电流和自身温度。精密模拟库仑计数器通过电池正极端子与负载或充电器之间的检测电阻器对电流进行积分。电池电压、电池电流和硅温度由内部ADC测量。

baidu_34971492的博客 3161

从零开始:使用Verilog在FPGA上实现8051微控制器的完整指南

8051微控制器是一种8位微控制器,由Intel在1980年代初推出。它包括一个CPU、一些RAM和ROM、I/O端口、定时器和串行通信接口。由于其简单的架构和强大的功能,8051已经成为了嵌入式系统设计的首选。FPGA是一种集成电路,设计师可以按照自己的需求进行编程。与传统的ASIC(应用特定集成电路)相比,FPGA提供了更高的灵活性,允许在硬件级别进行快速原型设计和迭代。这里,我们定义了一些基本的输入/输出端口,如时钟clk、复位reset、数据输入/输出和地址输入/输出。

qq_38334677的博客 1331

【转】我的面向对象程序观

在查找”基于对象“和”面向对象“时,发现了这篇文章,感觉写得挺好的,不过不知道出自哪里了。一、面向对象概念的一些误解 "面向对 象"是一个如今被人叫烂的词汇,就像去年人们都喜欢把自己的公司打上".com"的标记一样。其实有多少人能真正理解这个词汇呢,很难说。我喜欢这样来比 喻人们对"对象"一词的滥用。"对象"就好比人们经常说的"酷"和"爽",很多人并不仔细考虑这两个词的差别,在很多情况下...

dengqi4009的博客 123

芒果YOLOv7改进04:Loss篇:原创改进损失函数Repulsion:独家首发最新改进Repulsion Loss解决目标遮挡场景下检测,为解决密集人群检测中遮挡设计的损失函数,打造高效检测器涨点

YOLOv7原创改进Repulsion|首发最新改进为解决密集人群检测中遮挡设计的损失函数

包括YOLOv5、YOLOv7、YOLOv8等模型改进 3251

[转载]我的面向对象程序观

[转载]我的面向对象程序观         1)面向对象概念的一些误解         “面向对象”是一个如今被人叫烂的词汇,就像去年人们都喜欢把自己的公司打上“.com”的标记一样。其实有多少人能真正理解这个词汇呢,很难说。我喜欢这样来比喻人们对“对象”一词的滥用。“对象”就好比人们经常说的“酷”和“爽”,很多人并不仔细考虑这两个词的差别,在很多情况下他们是通用的,“酷”和“爽”通常表达“心情不

彭建军的专栏 1032

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java面向对象要学哪些东西_要想学好java,你应该有面向对象的程序观

学习java都知道,这和C语言不一样,C语言是面向过程的,而java语言是面向对象的,所以大家常说万物皆对象,这句话说起来简单,但是细细品味的话,其实还有很多地方值得深思,这句话你是怎么理解的?面向对象和基于对象面向对象和基于对象是两种不一样的思想,不能一概而论,面向对象有三大特点,分别是封装继承和多态,而现在有许多先进的技术是基于对象的编程,它们使用一些封装好的对象,调用对象的方法,设置对象的属...

weixin_42524165的博客 274

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《编程导论(Java)·1.1.2 颠倒的世界(柏拉图法则)》

面向对象范式的第一原则,yqj2065称之为柏拉图法则

yqj2065的博客 2029

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于对象和面向对象

以前看书时,看到过基于对象和面对对象,不过没有深究。今天又看到了就好好地在网上搜了搜。 好多地方都有如下一段: “面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)缺一不可,通常“基于对象”使用对象,但是无法利用现有的对象模板产 生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点,而“多态”是表示为父类类型的子类对象实例,没有了继承的...

dengqi4009的博客 217

命令式编程范式简介

命令编程范式的核心观念和观念范式:以机器的运作方式看待一切。

yqj2065的博客 1854

《编程导论(Java)·1.1.2 颠倒的世界(柏拉图法则)》

假设你读《编程导论(Java)·1.1.2 颠倒的世界(柏拉图法则)》感到无趣,请尝试评价这个段子。 3. Classes Classes drive me crazy. That might seem strange, so let me explain why. Clearly classes should be great. Our brain excels ...

weixin_30855761的博客 209

第二十二课.JAVA程序的结构

Java语言是面向对象的程序设计语言,Java程序的基本组成单元是类,类体中又可包括属性与方法两部分。而每一个应用程序都必须包含一个main()方法,含有main()方法的类称之为主类。 作为一个可以独立运行的Java程序,在它的众多类中必须要有一个类作为程序的起始类,为了方便,本书把这个类称为主类。当需要执行一个程序时,人们在java命令后面输入的便是这个主类的文件名(也是主类名),因此主类文...

xuenixiang.com 219
上一篇: 文件结构(摘录)
下一篇: 名词概念
evers
博客等级 码龄24年 7粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值