`
cloverprince
  • 浏览: 129446 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

你不可能踏进同一条河两次

阅读更多
Q:你会Java?
A:是。

Q:请用Java描述一个工人,它有姓名和工龄(可以理解成这项工作做了多少年)
A:简单:
class Worker {
  private String name;
  private int years;

  // Getters and setters ...
}


Q:嗯。很好。继续:程序员是是一种工人,他熟悉一种语言。
A:也简单。看好:
class Programmer extends Worker {
  private String language;
}


Q:相当不错!接下来,经理是一种工人,它管理多个工人。
A:看着:
class Manager extends Worker {
  private List<Worker> workers;
}


Q:完美!现在,有一位叫张三的程序员,还有一名叫李四的经理,管理张三。
A:
// in some method...
Programmer zhangSan = new Programmer();
zhangSan.setName("张三");
Manager liSi = new Manager();
liSi.addWorker(zhangSan);


Q:现在,张三不当程序员了,也当了经理,但仍然是李四的下属。
A:应该这样吧:
 // patch some codes
-Programmer zhangSan = new Programmer();
+Worker zhangSan = new Programmer();
 // new codes
 zhangSan = new Manager();


Q:哎哎,等一下。你创造了一个新的对象。我是说张三变成经理了。
A:是啊。张三变了,就不是原来那个张三了。

Q:岂有此理,黄河水还每天流呢,难道说明天就不是原来那个黄河了吗?
A:记得赫拉克里特是这么说的。而且,String a="foo"; a="bar";a不是也变成新的对象了吗?

Q:那么,liSi那里保留的zhangSan的引用,还是原来的?
A:这……还是原来的,没有更新。


Q:插一句,张三改名叫张无忌了,怎么实现?
A:
zhangSan.setName("张无忌");


Q:哎?改个名字,倒还是原来那个对象阿。
A:是。只要不改职业就行。
Q:为什么改名字行,改职业就不行?
A:谁让Java是“静态类型语言”呢?每个对象都有一个在运行时无法改变的“类型“。我知道的是这样,是不是真的不能改,我才疏学浅,就不知道了。


Q:算了。继续。王五是一个工人,干程序员干了10年,经理干了5年,现在双重职位。
A:这可能吗?
Q:需求如此。
A:……好像不行。我用C++试试
class ProgrammerAndManager : public Programmer, public Manager {
private:
  // no new attribute
};

ProgrammerAndManager *wangWu = new ProgrammerAndManager();


Q:嗯。wangWu对象里面,years这个成员变量保留了几份?
A:两份。一份从Programmer继承,另一份从Manager继承。
Q:那么,name有几份?
A:也是两份。
Q:这么说,王五干两个工作还起不同的名字?
A:。。。也许吧。或者……这样:
class Programmer : virtual public Worker {
  // ...
};
class Manager : virtual public Worker {
  // ...
};


Q:这下子,从两边继承的name就是共享的了。
A:正是
Q:那么,years呢?他做两个工作时间不一样长。
A:这……没办法了。

A:我试试重构一下
class Worker {
  private String name;
  private List<Job> job;
}

class Job {
  private int years;
}

class Programmer extends Job {
  private String language;
}

class Manager extends Job {
  private List<Worker> workers;
}

  // within some method
  Worker zhangSan = new Worker();
  zhangSan.addJob(new Programmer());

  Worker liSi = new Worker();
  liSi.addJob(new Manager());

  Worker wangWu = new Worker();
  wangWu.addJob(new Programmer(10));
  wangWu.addJob(new Manager(5));


Q:看似不错。现在,让王五写一段程序,要签名的。
A:这样:
// Change this class:
class Job {
  private Worker worker; // Associated worker
}
class Programmer extends Job {
  private String language;
  public writeProgram() {
    System.out.println(this.getWorker().getName() +
               "wrote a program in " +
               this.getLanguage());
  }
}

  pubic static void main(String args) {
    Programmer wangWuSProgrammerAspect = new Programmer("java",5);
    Worker wangWu = new Worker();
    wangWu.setName("王五");
    wangWu.addJob(wangWuSProgrammerAspect);
    
    wangWuSProgrammerAspect.writeProgram();
  }


Q:不错。不过,看上去不是wangWu本人在写程序。
A:嗯。倒像是wangWu体内的某种Programmer本能在代替他本人作出行为。
Q:那么,wangWu还算是会写程序的吗?
A:要不这样?
class Worker {
  void writeProgram() {
    throw new MethodNotImplementedException();
  }
}

Q:不好。360行的动作都写进来?
A:还是算了吧。

分享到:
评论
3 楼 charliebrown 2010-07-13  
cloverprince 写道
charliebrown 写道
哇~感谢~
最近正在从过程化编程思想向面向对象的编程思想转变
看了这篇文章很有启发啊~


囧,我刚想从面向对象的编程思想转移走。


唔……现在感到面向过程的思考会出差子,不利于分块开发啊
你又是为啥想总面向对象移走呢?
2 楼 cloverprince 2010-07-07  
charliebrown 写道
哇~感谢~
最近正在从过程化编程思想向面向对象的编程思想转变
看了这篇文章很有启发啊~


囧,我刚想从面向对象的编程思想转移走。
1 楼 charliebrown 2010-07-06  
哇~感谢~
最近正在从过程化编程思想向面向对象的编程思想转变
看了这篇文章很有启发啊~

相关推荐

    谁掌握数据谁就踏进了信息时代.pdf

    数据,这个21世纪的新原材料,正在引领我们进入信息时代。在这个时代,谁掌握了数据,谁就掌握了关键的竞争力。数据不再仅仅是数字的堆砌,而是成为指导...对于个人和企业而言,掌握数据,就是踏进了信息时代的门槛。

    一个完整的认识过程,需要经过两次飞跃.doc

    18. 两次踏进同一条河流的观点:前者“人不能两次踏进同一条河流”是辩证法,强调事物的运动变化;后者“人一次也不能踏进同一条河流”夸大了事物的流动性和变化性,倾向于诡辩论。选项A正确。 19. 否定之否定规律...

    lsb06 股权的架构:公司怎么样避免踏进雷区? (2).pdf

    lsb06 股权的架构:公司怎么样避免踏进雷区? (2)

    西方哲学史期末考试题及答案.doc

    他认为事物在变化中既有存在也有不存在的状态,正如人不能两次踏入同一条河。这种观点合理地解释了世界的变化无常,但可能忽视了存在的稳定性。 相比之下,巴门尼德则认为存在是永恒不变的,不存在的东西不能存在,...

    云南省景洪市第一中学13-14学年高二上学期期中考试试题(政治).docx

    与这个观点相一致的是D“人不能两次踏进同一条河流”,该说法由赫拉克利特提出,表示事物是不断变化的,不可能两次踏入完全相同的河流。 3. 唯物主义的基本观点:世界的本质是物质,先有物质后有意识,意识是物质的...

    2021年高中政治 2.4.2认识运动 把握规律精品同步测试 新人教版必修4.doc

    2. 物质与运动的关系:材料中的“人不能两次踏进同一条河流”以及“人一次也不能踏进同一条河流”两个观点分别反映了运动的绝对性和否认相对静止的极端看法。前者肯定了物质运动的绝对性,而后者否认了事物的相对...

    《小马过河》PPT课件.ppt

    故事中的小马需要帮妈妈把麦子驮到磨坊,途中遇到了一条河,挡住了去路。小马分别询问了体型庞大的牛伯伯和体型小巧的松鼠关于河水的深浅,得到了截然不同的答案:牛伯伯说河水很浅,而松鼠则警告河水深得足以淹死它...

    两次并购打造文化产业“航母”——记新华发行集团借壳上市及新华传媒定向增发.pdf

    《两次并购打造文化产业“航母”——记新华发行集团借壳上市及新华传媒定向增发》这篇文章详述了新华传媒如何通过两次重大资产重组,从单一图书发行业务转向综合性平面媒体服务提供商的过程,最终构建起文化产业的...

    马克思模拟二试卷及答案.doc

    5. 静止与运动:形而上学通常将事物看作是静态不变的,"天不变,道亦不变"体现了这种僵化的思维方式,而"人不能两次踏进同一条河流"则揭示了运动和变化的哲学观点。 6. 物质观:物质无非是各种物的总和,这一观点是...

    脚踏开关 FOOTSwitch:设置程序及教程.zip

    5. **高级功能**:对于一些高级用户,设置程序可能还提供了宏录制和播放功能,允许用户预设一系列操作,然后通过一次脚踏开关触发。这对于需要重复执行复杂操作的用户来说非常有用。 6. **系统兼容性**:由于标签...

    认识运动把握规律省级公开课PPT学习教案.pptx

    - 赫拉克利特认为“人不能两次踏进同一条河流”,承认了运动的绝对性和变化的连续性。 - 克拉底鲁则主张“人甚至一次也不能踏进同一条河流”,过度强调运动的绝对性,忽视了静止的相对存在。 - 科学的观点是既要...

    兴业2019年事业编招聘考试真题及答案解析版(1).docx

    8. 哲学观点辨析:“人不能两次踏进同一条河流”强调事物的流动性和变化,是辩证法思想;而“人不能一次踏进同一条河流”则可能被解读为否认相对静止,偏向诡辩论。两者在哲学上有所不同。 9. 量变与质变的关系:这...

    贺炜经典解说,贺炜经典语录.doc

    点评:化用希腊哲学家赫拉克利特的名言“人不能两次踏进同一条河流”,说明法国在同一地方犯了错而与成功失之交臂,幽默且意味深长。贺炜的解说词展现了他的文学功底和哲学知识,让观众感受到比赛的教训和警示。 9....

    【薪酬报告】脚踏自行车行业2021年薪酬调查报告.docx

    例如,报告指出,学历较高的管理者通常能获得更高的薪酬,而不同性质的企业可能对同一职位的薪酬设定有所差异。这些数据为企业制定薪酬战略提供了具体参考,有助于企业在设定薪酬时考虑到行业平均水平,避免过高或过...

    二手车的知识.docx

    - **检查前轮磨损**:前轮花纹不均匀磨损可能与前束、外倾角度不当有关,也可能是转向系统存在问题。 综上所述,购买二手车时,应从多个方面综合考虑,特别是车架、制动系统和轮胎的检查尤为重要。这些检查不仅能够...

    高三政治第一学期阶段测试试题.docx

    - “人不能两次踏进同一条河流”表达了运动与静止的统一,而“人一次也不能踏进同一条河流”则可能被视作夸大运动的绝对性,属于诡辩论的观点。 9. 时间的哲学理解: - 心情愉快时感觉时间飞逝,心情抑郁时觉得...

    福建省龙岩市武平县十方中学七年级政治课件:自 我 新 认 识(人教版).ppt

    赫拉克利特的名言“人不能两次踏进同一条河里”强调了变化的普遍性,暗示我们应该适应并欣赏这种变化。 总之,【自我新认识】这个主题的核心是教导青少年建立正确的自我认知,既要看到自己的优点,也要正视缺点,...

    GTIT简单入门

    在提供的资料中,有两个文件:“Git简单入门.odp”和“Git简单入门.pdf”,它们可能是同一内容的不同格式,方便用户根据喜好选择查看方式。ODP是OpenDocument Presentation的缩写,是一种开放文档格式的演示文稿;...

    减肥不可能成功的6种人.doc

    本文将详细解析六种减肥不可能成功的典型人群,并提供相应的建议。 首先,那些已经过于瘦弱的人,BMI低于18.5的人群,继续减肥可能会对健康构成风险。体脂率是衡量健康的重要指标,一味追求低体重可能导致肌肉流失...

Global site tag (gtag.js) - Google Analytics