>面向对象程序设计中的对象是对现实世界中对象的抽象表述,现实世界中的
>对象是不断演化的,即其状态是不断变化的,而对象处于不同的状态,会有
>不同的行为。我们封装的对象,而不是对象的一个状态。所以,在oo design的时候要考虑对象的多种可能状态及相应行为。

解决方案 »

  1.   

    in that case as you said,  i do not consider as good design to separeate closebox and openbox into two different classes. 
    in real life for more complicated situation, can you define other classes to perform the "open" and "close" action?
      

  2.   

    在现实系统中,对象的演化是经常需要用到的。
    比如在TCP通讯模型中,在整个通讯
    过程中,TCP结点可以有十几个状态,而且在不同的状态有不同的行为。例如CLOSED,LISTEN,SYN_RCVD等等。
    CLOSED closedNode = GetTCPNode();
    closedNode.passiveOpen();
    现在,closedNode演化为OPEN对象。
    chenyuan_tongji老兄说的“在oo design的时候要考虑对象的多种可能状态及相应行为”其实与我说的那个解决方案是一样的道理,的确是一个解决方案,但不是一个好的解决方案。
      

  3.   

    你上面说得TCP模型,是你的设想,还是什么公共库?
      

  4.   

    我说的TCP模型,就是TCP规范的状态转换图。
      

  5.   

    我觉得:box的开关状态应该利用它的一个属性来表示更好一些,而不是分为两个子类。这样和实际的对象映射也贴切一点
      

  6.   

    也许我的例子举的不是很恰当,再举一例,比方说我们现在有一个Egg(鸡蛋)对象。经过孵化以后,蛋变成了小鸡。此时,蛋对象消失,小鸡对象产生。
    我们想要的就是如何实现对象的平滑演化。
      

  7.   

    agree  cloudwon(地球之巅) 的說法。
      

  8.   

    其實這個你可以用到temporal property(時效屬性)模式,其中你可以去http://gigix.cool2u.net/ 上看一下關於時效模式的說明
      

  9.   

    多谢weimenren 大侠。
    诚如weimenren所言,目前这种问题的处理一般都是用委托模式处理。
    有没有更好的办法?自然一点的!
    Temporal property 跟这个无关!
      

  10.   

    你的这个问题,接口好像可以帮忙。或者你既然要这个类能变为另一个类,从这句话可看出,写两个类,必要时创建另一个类的对象不就行了。或许我没遇到你的问题,所以不能体味你的想法。我个人觉得在你很好的应用OOS、OOD和OOP后,你的问题应该不是问题,一个好的解决方案一般会使你的程序代码易写,而且综合运用这3者好的话你的软件才具有一个好软件的条件之一。谨代表个人观点,仅供参考!
      

  11.   

    的確,temporal property中是沒有關於兩個對象的創建與銷毀。而其實真正比較好的方法是使用接口,我們知道擴展和復用一個類的功能常用的是繼承,而需要動態的繼承的話,使用委托模式比較好。一個對象需要在不同的時間“成為不同的衍生類”那麼這個對象根本不應該是一個衍生類。而一個對象可以在不同的時間委托給不同的對象。使用委托可以很容易的在運行時刻對行為進行組合
      

  12.   

    一个对象,自它诞生之时起,其对外的接口就是不变的了,对不,不管是用继承还是委托还是其它?
    而我希望的是对象在演化的过程中可以改变其接口,正如一个蛋对象不应该具有鸡对象的接口一样。
    听说LISP语言支持程序对象的演化,对象在运行时可以修改自身代码,不知各位用没用过LISP,给介绍一下,不胜感激。本人目前想从OO的思路进行AI的研究,例如智能体(Agent),一个Agent在网络世界里学习、进化,当然其技能会不断提高,拥有的知识可以不断增加,其状态也会不断演化,如何设计一种Agent的结构(使用Java or C++)是一个基本的问题,希望各位不吝赐教!