`
wangminshe89
  • 浏览: 691024 次
文章分类
社区版块
存档分类
最新评论

用正确的小汽车对象学习和熟悉类的概念

 
阅读更多

用正确的小汽车对象学习和熟悉类的概念


作者:shuke来源:PHP蓝皮书
很多书讲到类总喜欢拿小汽车来做例子,但是有些例子实在是又臭又烂误人子弟,骗人钱财,毁人前程,弱智低级到瞎编一个什么 set_color()函数来教人。实在是白白糟踏了好东西。今天在phpx.com又看到一个受害者,忍不住花了两个小时写了这个教程。


闲话少说,我们来正经的,我们的小车可不是随便让人图图颜色就完了(只能图颜色的是废车)。我们的这个小车不但能够到处乱跑,而且装备了高级GPS全球定位系统,油表,里程表。由于使用了面向对象的技术,驾驭这样的一部小汽车一点都不难。

举例子首先要提供一些背景材料。我们有一辆小汽车,可以在一个拥有xy坐标的地图上按照东南西北方向任意的行驶,你可以设定小车行驶的方向和距离,小车会向你汇报它的坐标位置。

其实学习类应该和我们学习其它事物一样,从学习使用开始,然后再学习他的原理。所以我们先来熟悉一下如何正确驾驶这样的一个小汽车:

<?php
$startPoint = & new Position(3,9); //初始一个出发点坐标x=3,y=9

$myCar = & new Car(500,$startPoint); //我得到一个新的小车,新车初始燃油 500 升,出发地点$startPoint。

$myCar->setHeading('s'); //给小车设定方向 s:南方 n:北方 w:西方 e:东方。

if($myCar->run(100)) //然后让小车跑100公里,如果顺利完成任务显示燃油量。如果半途而废,我们显示警报信息。
{
print('<br><b>小车一切正常,目前还有燃油:'.$myCar->getGas().'</b>');//获得燃油数
}
else
{
print('<br><b>小车出问题了: '.$myCar->getWarning().'</b>');//显示警报信息
}

$myPosition=$myCar->getPosition();//获得小车当前的位置

print('<br>我的小车现在<br> X:'.$myPosition->getX().'Y:'.$myPosition->getY());//显示小车的坐标位置
?>

先给自己制造一个小汽车,并且给他装备上一个定位对象 Position。 然后设定方向, 然后让小车奔跑。 最后检查并输出小车的方位。 复杂么?很难理解吗? 虽然这里我们用到了两个对象(类):CarPosition 但是我相信即使是初学者也不会觉得上面的代码很困难。

我们学会如何开车了以后,再来仔细看一看这个小车对象是怎样工作的。定义一个对象其实很简单只需要 用一个关键字class 和一对{}就可以了,所以我们这样定义这两个对象:

class Car {}
class Position{}
当然,仅仅这样的两个类什么也做不了,我们还需要给他们增加一些功能,先从小汽车开始,我们需要能够给小车设定方向并且让小车奔跑所以我们增加两个方法,也就是2个函数只不过这两个函数包含在小车对象内只有通过小车对象才可以使用。
  • setHeading()
  • run()
class Car
{
	function setHeading($direction)
	{

	}

	function run($km)
	{

	}
}
特别提示:设计一个良好的类的窍门是从如何使用它下手,也就是说先考虑这个对象应当有哪些方法,而不是先确定它有哪些属性。
为了更好的了解小车的状况我们还需要这些方法:
  • getGas() 获得小车当前的燃油数
  • getPosition() 获得小车当前的位置
  • getWarning() 警报信息

为了完成这些功能我们的小车还需要自己的油表,警报消息,和定位仪。我们把这些也添加到 Car 类中,同时我们还给这个类增加了一个初始化的函数 这个函数名字和类的名字一样,这样就有了一个大体的框架。

<?php
class Car
{
/**
* 小车的汽油量
*
*@var
*@access
*/
var $gas;

/**
* 里程记录
*
*@var
*@access
*/
var $meter;

/**
* 车的位置(由GPS自动控制)
*
*@var Object position
*@access private
*/
var $position;

/**
* 发动机每1公里耗油量,这个车是0.1升
*
*@var Integer
*@access private
*/
var $engine=0.1;

/**
* 警报信息
*
*@var
*@access
*/
var $warning;

/**
小车的初始化。新车出场当然要
1、加汽油。
2、里程表归零。
3、清除警报信息。
4、设定出发位置。
*/
function Car($gas,&$position)
{
$this->gas= $gas; //加汽油
$this->meter = 0;
$this->warning =''; //清除警报信息
$this->position = $position; //设定出发位置
}

function getWarning() //返回警报信息
{
return $this->warning;
}

function getGas() //返回汽油表指数
{
return $this->gas;
}

function &getPosition()
{
return $this->position; //返回当前小车的位置
}

function setHeading($direction='e')
{

}

/**
* 开动小汽车
*@access public
*@param INT 公里数
*/
function run($km)
{

}

}
?>

这时候最关键的两个方法 setHeading 和 run 就变得简单了,由于小车装备了 Position 对象 $this->position, 所以关于坐标定位的事情它也不用管了, 交给 Position 对象好了, 他自己只要管理好自己的油表,里程表就可以了。完成以后的 Car 类变成这个样子了:

<?php
class Car
{
/**
* 小车的汽油量
*
*@var
*@access
*/
var $gas;

/**
* 里程记录
*
*@var
*@access
*/
var $meter;

/**
* 车的位置(由GPS自动控制)
*
*@var Object position
*@access private
*/
var $position;

/**
* 发动机每1公里耗油量,这个车是0.1升
*
*@var Integer
*@access private
*/
var $engine=0.1;

/**
* 警报信息
*
*@var
*@access
*/
var $warning;


/**
小车的初始化。新车出场当然要
1、加满汽油。
2、里程表归零。
3、清除警报信息。
4、设定出发位置。
*/
function Car($gas,&$position)
{
$this->gas= $gas; //加满汽油
$this->meter = 0;
$this->warning =''; //清除警报信息
$this->position = $position; //设定初始位置
}

function getWarning() //返回警报信息
{
return $this->warning;
}

function getGas() //返回汽油表指数
{
return $this->gas;
}

function &getPosition()
{
return $this->position; //返回当前小车的位置
}

function setHeading($direction='e')
{
$this->position->setDirection($direction); //因为使用了Position 对象,小汽车不需要自己来操心XY坐标值了,交给Position 对象吧。
}

/**
* 开动小汽车
*@access public
*@param INT 公里数
*/

function run($km)
{
$goodRunFlag = true;//是否成功完成任务。
$maxDistance = $this->gas/$this->engine; //小车能够跑的最大距离。

if(($maxDistance)<$km)
{
$this->warning = '没有汽油了!';//设定警告信息,能跑多远就跑多远吧。
$goodRunFlag = false;//但是任务肯定完成不了。
}
else
{
$maxDistance=$km; //没有问题,完成任务以后就可以停下来休息了。
}
$this->position->move($maxDistance);//在坐标上移动由Position对象来完成,小汽车只要负责自己的油耗和公里表就可以了。
$this->gas -= $maxDistance*$this->engine;//消耗汽油
$this->meter += $maxDistance; //增加公里表计数
return $goodRunFlag;
}
}
?>

讲到这里我想我的这篇文章也该结束了。别着急,我当然还记得 Position 类还没有完成,但是有了上面小汽车的例子 Position 应该就非常简单了, 如果你理解了这个小汽车的类, 现在就是你一展身手的时候了, 你来完成这个Position 对象吧, 我相信你能够完成它(其实这正是面向对象和封装的美妙之处)。你需要记住先从Position 的方法开始设计比如:

  • getX()
  • getY()
  • move()
  • setDirection()

所谓类就是指某一类的事物,它可以是具体的(Car)也可以是抽象的(Position),我们通过封装简化了使用和操作就像我们使用电视,手机一样一点都不复杂。

一篇好的入门教程应该

  1. 生动真实的例子。
  2. 不但提供了正确的概念,在变量和函数命名,函数封装和调用上也值的学习。
  3. 即便你熟悉了面向对象编程以后也不会认为当初的例子有什么不妥之处。
  4. 如果你读完教程动手的话一定能够深刻体会到教程的美妙之处,大大减少了走弯路的机会。
  5. 好的代码是可以被人像书一样读懂,你认为呢?
(责任编辑:超越PHP)
分享到:
评论

相关推荐

    CANopen和canfestival移植、使用、学习资料

    学习和使用CANfestival,你需要掌握以下几个方面: 1. CANopen协议:理解CANopen的网络结构、SDO和PDO通信机制、NMT管理等基本概念。 2. CANfestival架构:了解CANfestival的模块化设计,熟悉其源码结构和接口函数。...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,...

    经典c#编程例子

    2. **面向对象编程**:C#的核心是面向对象,实例可能包含类的创建、对象的实例化、继承、封装和多态等概念。例如,一个简单的实例可能展示如何定义一个类来表示现实世界中的对象,如汽车或学生,以及如何通过方法...

    数据结构与C++试验指导书.docx

    在这个实验中,设计了一个汽车类vehicle,然后派生出小汽车car和卡车truck类,每个类都有特定的数据成员和成员函数,如车轮数量、车重、载人数和载重量。虚基类是一种特殊类型,用于处理多继承时可能出现的二义性...

    湖北汽车工业学院Java实验一 Java编程环境使用

    ### Java编程环境使用知识点 #### 实验一:Java编程环境使用 ##### 实验目标 - **掌握Java运行环境的配置**:了解如何正确地安装Java Development Kit (JDK)...这对于进一步学习更复杂的编程概念和技术具有重要意义。

    知识学习地图

    学习大数据需要理解分布式计算、数据存储、SQL查询和数据挖掘等概念。 3. **云计算**:云计算提供了一种按需获取计算资源的服务模式,分为公有云、私有云和混合云。主要技术包括IaaS(基础设施即服务)、PaaS(平台...

    pro/e学习的好资源

    - 练习1:打开、定向和编辑模型,通过这一练习,学员可以熟悉Pro/E Wildfire 3.0的基本界面和操作流程。 - 练习2:创建零件模型,学习如何使用Pro/E Wildfire 3.0的工具创建基本的零件模型。 - 练习3:创建组件,...

    TS16949:2016标准学习题库检索工具

    为了实现上述功能,我们需要对C++编程有深入理解,包括类、对象、继承、多态等面向对象编程概念。同时,我们需要熟悉MFC的控件使用,如对话框、列表视图、文本框等,以及如何处理用户输入和响应事件。在数据库操作...

    oop实践

    面向对象编程(Object-Oriented Programming,简称OOP)是一种软件开发方法,它基于对象、类和消息传递的概念,旨在提高代码的重用性、可维护性和可扩展性。在实际的软件开发中,OOP是解决复杂问题的有效工具,通过...

    java考试测试题

    - **行为(方法)**:题目中提到的“汽车类”的行为,需要理解面向对象编程中的类和对象的概念,特别是类中的方法代表的行为。 - **知识点扩展**:深入了解面向对象编程的基本概念,如类、对象、继承、封装等。 5...

    C# 入门资料(初学者必备)

    类是面向对象编程的核心概念之一,正确地设计和使用类对于构建高质量的软件至关重要。 ##### 第十一章 方法 **11.1 方法的声明** - **返回类型**:方法执行后返回的值的类型。 - **方法名**:方法的标识符。 - **...

    JAVA工作自我鉴定范文.pdf

    除此之外,Java的面向对象还包括类的定义、对象的创建、方法的定义和调用、访问控制修饰符(public、private、protected和默认),以及接口和抽象类等概念。接口提供了一种规范,让不相关的类实现相同的行为。抽象类...

    H5小游戏源码 汽车物理学.zip

    本资源提供了一个名为"汽车物理学"的H5小游戏源码,为开发者提供了一个学习和实践的机会,特别是对于那些对游戏物理引擎感兴趣的程序员。 H5小游戏源码是基于HTML5、CSS3和JavaScript等技术构建的,这三大技术是Web...

    东软 校园招聘考试套题 嵌入式 Java C++

    1. Java基础:掌握类、对象、继承、多态、封装等面向对象编程概念,以及异常处理和集合框架。 2. Java SE和Java EE:理解Java标准版和企业版的区别,了解Servlet、JSP、JDBC、EJB等企业级开发技术。 3. Java内存...

    长途汽车信息管理系统课程设计报告报告.pdf

    - 用Java编程语言实现系统的前端界面和逻辑控制,这要求熟悉Java的基础语法、面向对象编程以及异常处理。 - Java Database Connectivity (JDBC) 是Java连接数据库的标准接口,用于执行SQL语句,实现Java程序与...

    嵌入式开发专题C语言嵌入式系统编程修炼

    此外,函数的使用和编写,结构体和联合体的应用,以及预处理宏的利用,都是嵌入式开发中常见的C语言技术。 面向对象编程(OOP)在嵌入式领域的应用虽然不像在桌面或服务器端那么广泛,但也有其价值。C语言本身并不...

    3dsMax2013中文版基础教程目录(初稿).pdf

    学习者将通过制作“汽车人影集”、“精美酒瓶”等案例,理解贴图在增加模型细节和真实感中的重要作用。 第八章讲解摄影机和灯光的应用,如何设置摄影机以获得理想的景深效果,以及使用不同类型的灯光模拟日光和夜光...

    从入门到精通学习PID控制算法

    PID控制算法是自动化控制领域中最常见且重要的控制算法之一,尤其在工业自动化、机器人控制、航空...同时,逐步学习和熟悉PID控制器在实际工程项目中的调试和优化技巧,将使你在控制理论与实际应用之间建立稳固的桥梁。

    微信小程序-仿爱卡源码

    3. JavaScript基础:小程序的业务逻辑主要是用JavaScript实现的,需要掌握基本的变量、函数、对象、事件处理等概念。 4. API调用:熟悉微信小程序提供的各种API,如网络请求、数据存储、地图、多媒体等。 5. 数据...

Global site tag (gtag.js) - Google Analytics