(小议)面向对象

  什么是面向对象?如果让我理解,只有一句话:它是一个与面向过程相对的概念,是一种进化或者升级。人们所设计的程序几乎都是线性思维,即一步一步往下执行。对于一个没有人机交互的简单程序来说,这是简单易行的。然而,对于一个人机交互频繁的复杂程序来说,比如某个你所熟悉的游戏,这绝对是一个毁灭性的灾难。比如一个三人斗地主的游戏,我们会很自然把它描述成一个面向过程的算法。我的意思是说,通常情况下,我们的设计思路应该是这样的:1、选地主  2、发牌  3、轮流出牌  4、判断胜利。显然,这个思路是较为完善的。然而,如果我们进一步的加以思索,就会发现整个流程显得不够精简。我们至少可以提出以下见解:1、对于游戏中的三个玩家,其实他们有很多共同点。都能选地主、出牌、判定。2、我们能否让代码更精简一些。比如每个人都要判断是否胜利,我们能否写一遍就够了。3、地主和农民是有一些区别的,我们如何既能够精简代码,又顺利区分它们。

  我以为,当人们遇到这种问题的时候,很自然的就会根据事物的共性抽象出事物的一个类。就好像根据香蕉、苹果、橘子抽象出水果这个类一样。具体来说,我们把每个玩家看成一个对象,对应于C#语言中的类。必须注意的是,这个类是一个具体的类别。通常情况下,我们总是用一个基类来描述具体类别的属性和方法。并且,具体的类别应该继承基类的属性和方法。我们再详细的说,我们可以把农民作为一个基类,并且规定农民的各项属性,比如发牌数、出牌规则等。紧接着,我们让地主继承农民这个类。这样,农民具有的属性方法,地主也有了。另一方面,地主和农民是有区别,比如地主牌多。这个问题可以用虚方法和重写方法去解决。就是把基类的方法改为虚方法,然后允许子类重写方法。

  我们来总结一下面向对象和面向过程的异同。面向过程需要写很多类似的判断,比如农民需要判断是否胜利,地主也要。而面向对象只要在基类中写好,子类继承就行了。除此之外,这种程序设计思想还有一个巨大的好处:可以被引用。与原来一个程序就一个main函数相比,这种方式的代码重复利用率是十分可观的。很自然的,它也更加有利于程序的扩展。

  到这里,我们说,面向对象思想的出现是极为自然的,并且符合现实需求的。它的出现对于程序设计无疑是一次质的飞跃。

转载于:https://www.cnblogs.com/xsddxz/p/5847712.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

int类型究竟占几个字节

最近在看深入理解计算机系统这本书,上面提到了在32位机器和64机器中int类型都占用4个字节。后来,查了The C Programming language这本书,里面有一句话是这样的:Each compiler is free to choose appropriate sizes for its own ha…

python fieldnames_csvreader.fieldnames在python中未被识别为csv reader对象的属性

我试图使用CSV模块在Python中提取CSV文件的标题.CSV文件非常扁平,看起来像:This, That, The Other1, 2, 3我正在做以下事情:>读入CSV文件并制作阅读器对象>将读者的迭代器推到下一行,强制它至少访问第一行一次(来自csv模块文档:“如果在…

Spring Insight – Web应用程序分析

您是否正在使用Spring Framework编写Web应用程序? 您是否曾经想过引擎盖下发生了什么? 为什么您的应用程序响应如此缓慢? 在您仍然等待应用程序响应的同时,为什么窗外的蜗牛如此之快地消失在远处? 您应该:)&#xff0c…

创建动态链接库时设置导出函数的方法

有两种方法1.使用模块定义文件, 2.在要导出的函数前加上 __declspec(dllexport) 我们用VS2008新建个DLL工程,工程名为“TestDLL” 把默认的源文件后缀 .CPP改为.C(C文件) int _stdcall MyFunction(int iVariant){return 0; } 1. 使用传统的模…

javascript的浏览器Bom详解,window、location、history对象

BOM(BrowserObjectModel)也叫浏览器对象模型,描述与浏览器进行交互的方法和接口。BOM由多个对象组成, 其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。 JavaScript由三部分组成:ECMAScript,BOM&…

python右斜杠_Python中的左斜杠、右斜杠(正斜杠和反斜杠)

首先,"/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠一般来说对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠,但是现在Windows(一)目录中的斜杠们python读文件需要输入的目录参…

重用生成的JAXB类

在本文中,我将演示如何利用– XJC扩展来重用以前从XML模式生成的类。 当其他XML架构导入XML架构并且您不想每次都生成相同的类时,这很有用。 导入的架构(Product.xsd) 以下XML模式代表有关产品的基本信息。 产品是此示例域中的常…

MySQL的Master/Slave群集安装和配置

本文介绍MySQL的Master/Slave群集安装和配置,版本号安装最新的稳定版GA 5.6.19。 为了支持有限HA。我们用Master/Slave读写简单孤立的集群。有限HA这是当Master不可用,数据不会丢失。但在Master写的,必须手工处理故障。假设要支持更高的可用性…

动态申请二维数组

以下是动态申请a[m][n]的源代码 代码一&#xff1a; /* 编译器&#xff1a;DEV C */ #include<stdio.h> #include<stdlib.h> int main() {int **a;int i,j,m,n;scanf("%d%d",&m,&n); a (int **)malloc(sizeof(int *)*m);for (i0;i<m; i){a[i…

判断线段和直线相交 POJ 3304

1 // 判断线段和直线相交 POJ 33042 // 思路&#xff1a;3 // 如果存在一条直线和所有线段相交&#xff0c;那么平移该直线一定可以经过线段上任意两个点&#xff0c;并且和所有线段相交。4 5 #include <cstdio>6 #include <cstring>7 #include <iostream>8 …

JavaOne正在重建动力

在JavaOne上度过了一个非常忙碌的一周&#xff0c;今年的活动有很多让人喜欢的地方。 有很多惊喜的公告&#xff0c;很多很好的内容/会议&#xff0c;并且在场地和组织上都有很多改进。 对于一直耐心等待我发表我所有演讲的人们&#xff0c;我为您的延迟表示歉意……给4个演讲一…

tensorflow http调用_《TensorFlow 内核剖析》笔记——系统架构

3 系统架构系统整体组成&#xff1a;Tensorflow的系统结构以C API为界&#xff0c;将整个系统分为前端和后端两个子系统&#xff1a;前端构造计算图后端执行计算图&#xff0c;可再细分为&#xff1a;运行时&#xff1a;提供本地模式和分布式模式计算层&#xff1a;由kernal函数…

SGU 187.Twist and whirl - want to cheat( splay )

维护一个支持翻转次数M的长度N的序列..最后输出序列.1<N<130000, 1<M<2000splay裸题...-------------------------------------------------------------#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int ma…

练习一万小时成天才

随着畅销书《异类》的流行&#xff0c;“练习一万小时成天才”这个口号现在是尽人皆知。也许仍然有不少人相信那些不世出的天才必有天生的神秘能力&#xff0c;但科学家通过大量的调查研究已经达成共识&#xff0c;那就是所有顶级高手都是练出来的。不但如此&#xff0c;最近几…

(转)数据流图

转自:http://jingyan.baidu.com/article/4f34706eefdb04e387b56deb.html 数据流图4种图元 数据流图的实例 转载于:https://www.cnblogs.com/wrencai/p/5852389.html

从CLI监视OpenJDK

目前&#xff0c;我大部分时间在Java虚拟机 &#xff08;JVM&#xff09;内或周围进行大量工作&#xff0c;大部分时间是在Linux上。 当事情变得不对劲并且我试图确定原因时&#xff0c;我接触了Java性能分析工具。 这些工具有两种形式&#xff0c;一种是精美的GUI&#xff08;…

python数据库优化_python | Mysql性能优化一

对mysql优化是一个综合性的技术&#xff0c;主要包括表的设计合理化(符合3NF)添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]分表技术(水平分割、垂直分割)读写[写: update/delete/add]分离存储过程 [模块化编程&#xff0c;可以提高速度]对mysql配…

MySQL中文乱码问题

项目中用到MySQL数据库时中文出现乱码问题&#xff08;中文字符都变成了&#xff1f;&#xff09;解决&#xff1a; 1、统一项目与数据库的编码&#xff0c;项目中用的是UTF-8因此我的把数据库的编码统一成UTF-8 修改方式&#xff1a;修改 MySQL根目录中的 my.ini 文件替换d…

json与字符串互转

1 字符串转JSON var objeval((str"))var objJSON.parse(str)var objstr.parseJSON()2 JSON转字符串 var strobj.toJSONString()var strJSON.stringify(obj)转载于:https://www.cnblogs.com/liu-xia/p/5050878.html

使用RequestFactory API进行Spring GWT集成

从GWT 2.4开始&#xff0c;将RequestFactory API与后端的Spring服务集成很容易&#xff0c;您需要做的就是在服务器上创建一个自定义ServiceLocator&#xff0c;GWT将使用它来正确定位被调用的服务&#xff1a; public class SpringServiceLocator implements ServiceLocator {…