黑马程序员技术交流社区

标题: OC课堂小疑问,求高手解惑 [打印本页]

作者: zhs    时间: 2014-7-12 19:30
标题: OC课堂小疑问,求高手解惑
本帖最后由 zhs 于 2014-7-12 19:33 编辑

在OC类和对象部分第14个视频中MJ老师讲到比较两辆车对象速度的练习,MJ老师在compareWithOther方法中定义了一个其他车对象的指针为方法的参数,在调用此方法比较的时候传进来一个其他车的对象指针,返回速度差。
我的疑问是:为什么不把compareWithOther方法的参数直接定义为int other speed,调用的时候直接传入其他车的速度other->speed,因为不管定义哪种参数,在主函数main中都要new两个车对象,我编程测试了下,是可以的,但MJ老师那样定义方法的参数一定有他的道理,请学过这块的同学谈谈你的看法,灰常感谢
作者: huangqiwa    时间: 2014-7-12 19:51
不明白你在纠结什么
你传一个spped 跟传一个对象 你觉得哪里不一样了吗?还是你觉得传一个seed效率更高?
MJ老师传一个对象进来,再取出对象的speed进行比较
而你的做法是先在外面把speed取出来,再传进去比较而已
作者: zhs    时间: 2014-7-12 21:19
huangqiwa 发表于 2014-7-12 19:51
不明白你在纠结什么
你传一个spped 跟传一个对象 你觉得哪里不一样了吗?还是你觉得传一个seed效率更高?
M ...

你说的对,但这两种不同的作法应该有利弊点,我想知道就是这个利弊
作者: 傘が咲く    时间: 2014-7-13 07:24
compareWithOther方法,是对象方法,加入了面向对象的思想,那你的问题就变成了 面向对象和面向过程的 利弊,这个有待自己深入理解。
作者: 温天恩    时间: 2014-7-13 09:04
你说的指针,其实就是一个地址,OC中实例化对象后,都需要一个指针变量来指向它,然后通过指针来操作这个对象,楼主所说用指针为参数时,不必要再定义一个整型变量来获取车对象的speed属性,再传递给compare方法,而是直接用指针操作车对象,中间省去一层,意味着程序运行时不需要为你新定义的整型变量开辟内存,更高效!
作者: fantacyleo    时间: 2014-7-13 10:22
温天恩 发表于 2014-7-13 09:04
你说的指针,其实就是一个地址,OC中实例化对象后,都需要一个指针变量来指向它,然后通过指针来操作这个对 ...

直接传指针也要开辟空间啊。调用带参数的方法都要开辟栈空间的。

作者: fantacyleo    时间: 2014-7-13 10:28
lz的问题,我觉得直接传入对象更好地体现了隐藏实现细节的思想(当然这个思想也不是面向对象的专利,我们用函数封装操作过程也是一种隐藏细节)。对车类的使用者来说,他不需要知道compareWith方法具体如何比较车速,因为车类最清楚该怎么比较。而有了隐藏实现细节,车类的设计者就可以在不干扰使用者的情况下,改变车类的内部设计,只要对外暴露的接口(方法)不改变。比如,某天车类设计者决定不用speed而用speeds来表示速度,那么你之前传入car.speed的代码就失效了,而直接传入车对象的代码则完全不受影响。
作者: 邱蚓    时间: 2014-7-13 12:30
我觉得这是一个关于面向对象跟面向过程的区别
作者: 小海    时间: 2014-7-13 13:30
楼上各位说的很清楚了,受益匪浅
作者: Medwyn    时间: 2014-7-13 13:32
傘が咲く 发表于 2014-7-13 07:24
compareWithOther方法,是对象方法,加入了面向对象的思想,那你的问题就变成了 面向对象和面向过程的 利弊 ...

就差分了,版主把我之前的帖子加加呗XD
作者: zhs    时间: 2014-7-13 13:58
fantacyleo 发表于 2014-7-13 10:28
lz的问题,我觉得直接传入对象更好地体现了隐藏实现细节的思想(当然这个思想也不是面向对象的专利,我们用 ...

谢谢你的回答,鞭辟入里,入木三分~
作者: zhs    时间: 2014-7-13 14:00
傘が咲く 发表于 2014-7-13 07:24
compareWithOther方法,是对象方法,加入了面向对象的思想,那你的问题就变成了 面向对象和面向过程的 利弊 ...

嗯,你说的对,是面向对象和面向对象思想的差别,感谢~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2