我为面向对象而烦恼

jazzbond 2009-09-28 09:41:19

我今日来在为"面向对象"编程思想苦恼 我的脑子真的转不过来

每次老师说要我们分析出一个系统所涉及到的"类"我就头疼,不是写差了,就是对系统的"类"还没想全 ,不要误会 这里的

全是说比较满意 就是总体不满意 不是方法不合理就是不理解他们之间的关系 譬如: 我举个例子

1. 打印机和纸 中就有个 "写字的方法" 这个方法是纸的方法还是打印机的方法

2. 人走到门边 去关门 "关门的方法" 这个方法是写在门类 还是人类中

3. 坦克 打击了 一辆坦克 判断有没有击毙 这个 "判断击毙的方法" 是坦克的方法吗

4. 一个人拿着两块石头要磨出石刀 请问这个 "磨的方法" 是人的方法还是石刀的方法


还有很多很多 很复杂的都有

我不是说为这几个问题就苦恼 我是说有时脑子真的会越来越混 遇到这些问题老是有点靠 "蒙"

希望大家给我一个 一击致命 的 说法 让我能真正理解 我有看面向对象的书

说实在的 面向对象就像个美女 把男人迷了又迷 我真不知到什么时候我才能清醒
...全文
722 107 打赏 收藏 转发到动态 举报
写回复
用AI写文章
107 条回复
切换为时间正序
请发表友善的回复…
发表回复
portal_website 2009-10-12
  • 打赏
  • 举报
回复
csdn的格式化文字真难受人!
portal_website 2009-10-12
  • 打赏
  • 举报
回复
以上人士说了很多,我觉得他们说的等于0!
因为不切你现在认识上的实际!
我完全理解你的难处,因为我也有过长达一年的迷茫![b]

当我听了马士兵老师的视频教程后,才有了一针见血的了解!
深深为程序员拙于口辞感到悲哀!无法将抽象问题形象化表达!
伟大的马老师教导我们:
瓶子是一个类,这个瓶子、那个瓶子就是对象!
故找类就去找名词!
这个瓶子、那个瓶子就是特指[/b]
jazzbond 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 90 楼 a8222777 的回复:]
  靠!我说呢  难怪! 爱玲怎么把号给你!是不是玩腻了就给你啊

  说她漂亮惹来一堆苍蝇,真的没错,难怪彬哥会很生气
[/Quote]

哈哈! 李哥啊! 你被耍了
jazzbond 2009-10-12
  • 打赏
  • 举报
回复


楼上的 面向对象分析的高手啊 牛! 我什么时候才能像你一样怎么分析问题啊
orangemike 2009-10-12
  • 打赏
  • 举报
回复
举个例子吧:
打印机和纸 中就有个 "写字的方法" 这个方法是纸的方法还是打印机的方法:

打印机往纸上打印其实需要两个条件:
1.可以打印.
2.可以被写.
因此打印机需要一个能往某个东西上输出字的功能,而纸需要一个可以被写字的功能.
再继续考虑:
可以被写字完全是纸自己的事情,不需要考虑打印机,所以你可以很放心的为纸添加一个show(...)方法.
而打印机输出字呢,为了能够正确打印,你必须给指定介质.
所以打印机就可以需要一个setPaper(paper)用来设置纸张,为了将文字转换为打印出来的墨点,打印机还需要一个功能,将文字转为一堆坐标和是否喷墨的信息convert(String),将一个墨点喷出去的方法draw()以及启动打印机的方法start()

最后再文字描述一下,打印的过程.
1.拿纸给打印机.
2.启动打印.
3.打印机将字转换为喷墨的坐标,开始将打印机头移动的相应点.
4.移动正确位置后喷墨.
5.纸收到墨点,颜色变黑.


所以代码就是.
1.将paper传给打印机:setPaper(paper);
2.让打印机开始打:start();
3.转换文字:convert(String);
4.喷墨:draw();
5.纸变黑:show(x,y,color,size);

以上比较细,设计阶段,我们不考虑实现,可以省略成
1.将paper传给打印机:setPaper(paper);
2.喷墨:draw();
3.纸变黑:show(x,y,color,size);

其中1,2还可以进一步合并成print(paper)
也就是:
1.print(paper)
2.show(...)
再继续考虑,
其中的步骤1,需要别的类调用,但是2仅仅由打印机执行即可.
因此在你的最终设计中应该这样设计:

纸可以显示一些东西: show(...);其中参数可能为:坐标,颜色,形状
打印机可以打印:void print(paper);并且在该方法中调用纸的show.

再进一步考虑,打印机只可以打纸么?
其实print方法真正关注的不是paper这个对象,而是show(...)这个行为,
所以再进一步修改设计:



//抽象一个接口
interface IShowAble{
void show(...);
}

//纸实现该接口
class Paper implements IShowAble{
void show(...){......}
}

//打印机不绑死在纸上,只要具有IShowAble行为的都支持.
class Printer{
void print(IShowAble shower){......}
}



"写字的方法",其实是个很笼统的说法,你觉得困惑,就是因为你思考的出发点本身就是笼统的缘故.
把问题的前提,环境条件,目的都描述详细,很多设计就自然而然了.





SealedBook 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 jazzbond 的回复:]
晕  老师说如果到时候出去工作还不明白什么叫面向对象  那你就废了
[/Quote]
试问现在有多少人真正明白什么叫面向对象呢?
不用听老师的这些化,他只是在用某种方式激励你学习罢了。
楼主继续努力!慢慢的就会理解
Debby_Bryant 2009-10-12
  • 打赏
  • 举报
回复
需求分析,不同的情况可能有不同的写法,,,
zhaozhiweiok 2009-10-12
  • 打赏
  • 举报
回复
我似乎有点明白老师说 合适的方法应该写在合适的类里面是什么意思了
qingxugw 2009-10-12
  • 打赏
  • 举报
回复
对我顶
qingxugw 2009-10-12
  • 打赏
  • 举报
回复
不用烦恼 你很快也可以学好的
DryKillLogic 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 clarence0124 的回复:]
引用 5 楼 jazzbond 的回复:


   为什么个人有个人的说法

   老师说打印机有打印的方法 纸有写字的方法
   坦克的子弹有判断 击毙 敌军坦克的方法



因为你老师也是人,他在用他的思维看问题
[/Quote]

没错!面向对象好多时候都是相对来说的,都是根据具体的需求来确定的,楼主不要沉迷于细节,要多动手敲代码,量变会产生质变的!加油

zenghuiss 2009-10-12
  • 打赏
  • 举报
回复
需要什么写什么,不必把哪一个方法强行规定在哪个类里面,最终是要解决问题。
当你所服务的对象需要这个功能时 ,你就可以添加实现这个功能的方法
面向对象只是让你将一个个问题实例化,方便解决问题
万物皆对象 知道这个就ok了
liurui03263348 2009-10-12
  • 打赏
  • 举报
回复
面向对象是很抽象的,这个得慢慢学,不能急于一时,实践出真知嘛!
WuBill 2009-10-12
  • 打赏
  • 举报
回复
100
smallbear923 2009-10-11
  • 打赏
  • 举报
回复
顶。。。
噢不 2009-10-11
  • 打赏
  • 举报
回复
63楼的哥们说的好
ctwei86 2009-10-11
  • 打赏
  • 举报
回复
多写代码,在一定代码量的基础上去思考,有了想法就写代码去尝试,尝试之后就要总结,二者相互促进,形成一个良性的循环,慢慢的就会好的。
myloveyoyo1314 2009-10-11
  • 打赏
  • 举报
回复
面向对象 是一种封装 把属于对象的操作 封装到一个对象里 门当然有关起来的方法 门.关闭 门.打开 只是一种情况 不同的需求 可能有不同的写法
其实编程开发也不外乎生活道理 如果把门关闭的方法 写在其它类里面 那么打开的方法呢 如果都写在其它类里面 那你的门类里面要写什么呢

初学者 对这个容易晕 其实最好老师们能举一下经得起推敲的例子 不然很容易误导学生
zuoguodang 2009-10-11
  • 打赏
  • 举报
回复
最重要的是解决问题
nypone 2009-10-11
  • 打赏
  • 举报
回复
我还以为这贴是个冷笑话~~~
加载更多回复(87)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧