1面向对象程序设计2面向对象设计的过程•大多数现代计算机应用设计采用面向对象设计(OOD)的方法,以数据为中心进行大量的计算。•OOD的本质是描述一个神奇的黑盒子系统及其接口。–每个部件通过其接口提供一些服务,其他部件是这些服务的用户(客户).–客户只需了解服务的接口,而实现细节对客户无关紧要.–服务组件只管提供服务的实现,不管客户如何应用.3案例研究:自顶向下设计•自顶向下设计:–函数是黑箱.–客户只要知道函数接口即能使用之.–函数实现细节被封装在函数定义中.•OOD:–黑箱是对象.–对象的能力由类定义.–类对外提供的接口即方法.–方法的实现对外部客户是不重要的.4OOD设计指南•OOD:对给定问题找出并定义一组有用的类的过程.–确定与系统相关有用的对象•考虑问题描述中各个对象的属性•这些对象有什么行为–确定实例变量——对象–确定接口•考虑问题描述中的动词(对象行为)–复杂方法的自顶向下逐步求精–反复设计–尝试其他途径–力求简单5编程实例:壁球•对象:–球员:有技术水平数据–一局比赛:输入两个球员,提供play()–得分统计:统计比赛结果,提供update(),printReport()•主程序核心代码:stats=SimStats()foriinrange(n):theGame=RBallGame(probA,probB)theGame.play()stats.update(theGame)•完整程序:objrball.py6编程实例:壁球游戏中的类和函数fromrandomimportrandomclassPlayer:def__init__(self,prob):…defwinsServe(self):…defincScore(self):…defgetScore(self):…classRBallGame:def__init__(self,probA,probB):…defplay(self):…defisOver(self):…defchangeServer(self):…defgetScores(self):…7编程实例:壁球游戏中的类和函数classSimStats:def__init__(self):…defupdate(self,aGame):…defprintReport(self):…defprintLine(self,label,wins,shuts,n):…defprintIntro():…defgetInputs():…8编程实例:壁球游戏中的主函数defmain():printIntro()probA,probB,n=getInputs()#Playthegamesstats=SimStats()foriinrange(n):theGame=RBallGame(probA,probB)#createanewgametheGame.play()#playitstats.update(theGame)#getinfoaboutcompletedgamestats.printReport()if__name__==__main__:main()raw_input(\nPressEntertoquit)9编程实例:壁球(续)•设计一个类时会获得其他类的设计思路–例如:实现SimStats的update(aGame)时,需要aGame的分数,由此想到RBallGame类应提供getScores方法.–又如:实现RBallGame时,发现技术是属于球员而非比赛的,因此应设计Player类.•各类间的关系可用图来表示10编程实例:DicePoker•游戏规则:–玩家开始时有$100.–每轮花$10进行游戏.–先投掷一手5个骰子.–然后有两次机会重掷部分或全部骰子.–最后根据上表结帐.•图形界面要求:–显示余额–玩家破产时自动终止,玩家也可选择退出–提示程序状态及用户如何响应的信息两对$5三同$8一对加三同$12四同$15顺子(1-5或2-6)$20五同$3011编程实例:DicePoker(续)•模型-视图(model-view)设计方法:将复杂程序分解为模型和用户界面.–模型是程序的核心,视图是模型状态的展现.–分开的好处:对同一模型,容易改变视图.–本例中:•游戏模型:PokerApp类•游戏界面:TextInterface或GraphicsInterface类12编程实例:DicePoker(续)•实现模型–低层对象:类Dice•构造器:初始化Dice对象集合体•rollAll:对5个骰子赋随机值•roll:对部分骰子赋随机值,其他不变•values:返回骰子当前值•score:返回骰子的得分(金额)–高层对象:PokerApp13编程实例:DicePoker(续)•实现界面–文本界面:测试用–GUI界面14编程实例:DicePoker——PokerApp类fromdiceimportDiceclassPokerApp:def__init__(self,interface):self.dice=Dice()self.money=100self.interface=interfacedefrun(self):whileself.money=10andself.interface.wantToPlay():self.playRound()self.interface.close()defplayRound(self):self.money=self.money-10self.interface.setMoney(self.money)self.doRolls()result,score=self.dice.score()self.interface.showResult(result,score)self.money=self.money+scoreself.interface.setMoney(self.money)defdoRolls(self):self.dice.rollAll()roll=1self.interface.setDice(self.dice.values())toRoll=self.interface.chooseDice()whileroll3andtoRoll!=[]:self.dice.roll(toRoll)roll=roll+1self.interface.setDice(self.dice.values())ifroll3:toRoll=self.interface.chooseDice()15编程实例:DicePoker—Button类fromgraphicsimport*classButton:def__init__(self,win,center,width,height,label):…defclicked(self,p):…defgetLabel(self):…defactivate(self):…defdeactivate(self):…16编程实例:DicePoker—ColorDieView类fromdieview2importDieViewclassColorDieView(DieView):defsetValue(self,value):self.value=value#rememberthisvalueDieView.setValue(self,value)#callsetValuefromparentclassdefsetColor(self,color):self.foreground=colorself.setValue(self.value)17编程实例:DicePoker—GraphicsInterface类fromgraphicsimport*frombuttonimportButtonfromcdieviewimportColorDieViewclassGraphicsInterface:def__init__(self):…defcreateDice(self,center,size):…defaddDiceButtons(self,center,width,height):…defchoose(self,choices):…defsetMoney(self,amt):…defsetDice(self,values):…defwantToPlay(self):…defclose(self):…defshowResult(self,msg,score):…defchooseDice(self):…18编程实例:DicePoker—guipoker.pyfrompokerappimportPokerAppinter=GraphicsInterface()app=PokerApp(inter)app.run()19OO概念:封装•将数据以及相关操作打包在一起的过程.•封装的结果就是对象概念.•世界是相互作用的对象构成的.•封装使”定义”与”使用”的SoC成为可能.•封装使得代码重用成为可能.20OO概念:多态性•给对象发了消息,具体做什么取决于该对象的类型.–例1:obj.draw(win)不同图形对象obj,响应相同的消息,而结果不同,即draw(win)画出不同的图形。–例2:obj.area()对象不同,圆形对象和矩形对象求出面积是不同的。–例3:obj.exam()学生不同,参加考试得到结果不同。21OO概念:继承•可以从现有的类出发,定义新类.–超类与子类•子类继承超类的变量和方法,并且另有自己的变量和方法.•好处:代码重用.22学生类的继承与派生关系图学生留学生研究生大学生中学生小学生高中生初中生本科生专科生博士生硕士生23继承与派生图例人类属性+行为人—抽象子类欧洲人子类亚洲人子类非洲人子类澳洲人子类美洲人子类日本人子类中国人…派生类派生类基类共有特性封装对象对象对象对象多态性对于同一件事,对象不同,实际操作有所不同(考生不同考试结果不同)。对象子类印度人……继承