面向对象程序设计:英文本

面向对象程序设计:英文本
作 者: Timothy Budd
出版社: 清华大学出版社
丛编项: 国外经典教材
版权说明: 本书为出版图书,暂不支持在线阅读,请支持正版图书
标 签: 面向对象
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  Timothy A.Budd是美国俄勒冈州立大学计算机科学系的副教授。他有二十多年的教学和实践经验,撰写了二十多年的教学和实践经验,撰写了多本深受学生欢迎的教材,其中包括Classic Data Structures in Java,Understanading Object-Oriented Programming With Java,C++for Java Programmers,Data Structues in C++ Using the Standard Template Library,Classic Data Strucures in C++,Multiparadigm Programming in Leda和A Little Smalltalk。

内容简介

本书特色:·定义了面向对象程序设计的术语·从面向对象的角度,对Java.,C++和C#进行了大量比较·借助于案例分析,说明各种形式的多态技术是如何应用于面向对象语言以及如何被用于创建软件框架的·涵括并采用了UML表示法和图·涉及到设计模式、反射与内省、网络编程以及面向对象语言的实现技术等高级主题此为双语教学推荐用书。作者以独立于程序设计语言的角度,全面介绍了面向对象程序设计的原理,如对象、方法、继承(包括多重继承)和多态等概念。同时,为帮助学生理解程序设计语言幕后的基本原理,还提供了用很多语言(Java、C++、C#、Delphi、Python、CIDS、Eiffel、Objective-C、Smalltalk)编写的范例。本书适用课程:计算机专业主干课“面向对象程序设计”原书使用情况:本书原英文版作为经典的面向对象技术教材,一直被国外很多大学(如哥伦比亚大学、佛罗里达大学、南非大学和罗马大学等)当作首选教材。配套网站(包含勘误、PowerPoint幻灯片等):http://web.engr.oregonstate.edu/~budd/Books/oopintro3e/info/ReadMe.html

图书目录

Preface v

1 Thinking Object-Oriented 1

1.1 Why Is OOP Popular? 2

1.2 Language and Thought. 2

1.2.1 Eskimos and Snow3

1.2.2 An Example from Computer Languages3

1.2.3 Church's Conjecture and the Whorf Hypothesis * 5

1.3 A New Paradigm6

1.4 A Way of Viewing the World.8

1.4.1 Agents and Communities8

1.4.2 Messages and Methods.9

1.4.3 Responsibilities 11

1.4.4 Classes and Instances.11

1.4.5 Class Hierarchies{Inheritance. 11

1.4.6 Method Binding and Overriding. 14

1.4.7 Summary of Object-Oriented Concepts14

1.5 Computation as Simulation *.15

1.5.1 The Power of Metaphor. 16

1.5.2 Avoiding In nite Regression 18

1.6 A Brief History *18

2 Abstraction 25

2.1 Layers of Abstraction 26

2.2 Other Forms of Abstraction.30

2.2.1 Division into Parts31

2.2.2 Encapsulation and Interchangeability 32

2.2.3 Interface and Implementation. 33

2.2.4 The Service View. 33

2.2.5 Composition34

2.2.6 Layers of Specialization. 35

2.2.7 Patterns. 38

2.3 A Short History of Abstraction Mechanisms*. 39

2.3.1 Assembly Language.39

2.3.2 Procedures. 39

2.3.3 Modules. 41

2.3.4 Abstract Data Types.42

2.3.5 A Service-Centered View43

2.3.6 Messages, Inheritance, and Polymorphism44

3 Object-Oriented Design 49

3.1 Responsibility Implies Noninterference49

3.2 Programming in the Small and in the Large 50

3.3 Why Begin with Behavior?.51

3.4 A Case Study in RDD 52

3.4.1 The Interactive Intelligent Kitchen Helper52

3.4.2 Working through Scenarios 53

3.4.3 Identi cation of Components. 55

3.5 CRC Cards{Recording Responsibility55

3.5.1 Give Components a Physical Representation 56

3.5.2 The What/Who Cycle.56

3.5.3 Documentation 57

3.6 Components and Behavior57

3.6.1 Postponing Decisions.59

3.6.2 Preparing for Change.59

3.6.3 Continuing the Scenario. 60

3.6.4 Interaction Diagrams.61

3.7 Software Components 62

3.7.1 Behavior and State62

3.7.2 Instances and Classes.63

3.7.3 Coupling and Cohesion. 63

3.7.4 Interface and Implementation{Parnas's Principles 64

3.8 Formalize the Interface 65

3.8.1 Coming up with Names. 65

3.9 Designing the Representation.66

3.10 Implementing Components.67

3.11 Integration of Components.68

3.12 Maintenance and Evolution.69

4 Classes and Methods 73

4.1 Encapsulation 73

4.2 Class De nitions74

4.2.1 C++, Java and C#.75

4.2.2 Apple Object Pascal and Delphi Pascal77

4.2.3 Smalltalk77

4.2.4 Other Languages. 79

4.3 Methods.79

4.3.1 Order of Methods in a Class Declaration 82

4.3.2 Constant or Immutable Data Fields 82

4.3.3 Separating De nition and Implementation83

4.4 Variations on Class Themes*.87

4.4.1 Methods without Classes in Oberon 87

4.4.2 Interfaces88

4.4.3 Properties89

4.4.4 Forward De nitions.90

4.4.5 Inner or Nested Classes. 91

4.4.6 Class Data Fields. 94

4.4.7 Classes as Objects96

5 Messages, Instances, and Initialization 101

5.1 Message-Passing Syntax. 101

5.2 Statically and Dynamically Typed Languages. 103

5.3 Accessing the Receiver from Within a Method. 104

5.4 Object Creation. 106

5.4.1 Creation of Arrays of Objects. 107

5.5 Pointers and Memory Allocation108

5.5.1 Memory Recovery109

5.6 Constructors 110

5.6.1 The Orthodox Canonical Class Form*. 114

5.6.2 Constant Values. 115

5.7 Destructors and Finalizers117

5.8 Metaclasses in Smalltalk*119

6 A Case Study: The Eight Queens Puzzle 125

6.1 The Eight-Queens Puzzle125

6.1.1 Creating Objects That Find Their Own Solution 126

6.2 Using Generators127

6.2.1 Initialization127

6.2.2 Finding a Solution129

6.2.3 Advancing to the Next Position130

6.3 The Eight-Queens Puzzle in Several Languages130

6.3.1 The Eight-Queens Puzzle in Object Pascal 131

6.3.2 The Eight-Queens Puzzle in C++.134

6.3.3 The Eight-Queens Puzzle in Java. 136

6.3.4 The Eight-Queens Puzzle in Objective-C139

6.3.5 The Eight-Queens Puzzle in Smalltalk. 141

6.3.6 The Eight-Queens Puzzle in Ruby143

7 A Case Study: A Billiards Game 147

7.1 The Elements of Billiards147

7.2 Graphical Objects. 148

7.2.1 The Wall Graphical Object 149

7.2.2 The Hole Graphical Object 150

7.2.3 The Ball Graphical Object 151

7.3 The Main Program. 155

7.4 Using Inheritance155

8 Inheritance and Substitution 161

8.1 An Intuitive Description of Inheritance161

8.1.1 The Is-a Test162

8.1.2 Reasons to Use Inheritance 162

8.2 Inheritance in Various Languages163

8.3 Subclass, Subtype, and Substitution. 163

8.3.1 Substitution and Strong Typing*. 167

8.4 Overriding and Virtual Methods167

8.5 Interfaces and Abstract Classes. 169

8.6 Forms of Inheritance170

8.6.1 Subclassing for Specialization (Subtyping)170

8.6.2 Subclassing for Speci cation 171

8.6.3 Subclassing for Construction. 171

8.6.4 Subclassing for Generalization172

8.6.5 Subclassing for Extension173

8.6.6 Subclassing for Limitation173

8.6.7 Subclassing for Variance. 173

8.6.8 Subclassing for Combination. 174

8.6.9 Summary of the Forms of Inheritance. 174

8.7 Variations on Inheritance*175

8.7.1 Anonymous Classes in Java 175

8.7.2 Inheritance and Constructors. 176

8.7.3 Virtual Destructors177

8.8 The Bene ts of Inheritance.178

8.8.1 Software Reusability.178

8.8.2 Code Sharing178

8.8.3 Consistency of Interface. 178

8.8.4 Software Components.178

8.8.5 Rapid Prototyping179

8.8.6 Polymorphism and Frameworks179

8.8.7 Information Hiding179

8.9 The Costs of Inheritance. 180

8.9.1 Execution Speed. 180

8.9.2 Program Size180

8.9.3 Message-Passing Overhead 180

8.9.4 Program Complexity.181

9 Case study { A Card Game 185

9.1 The Class PlayingCard 185

9.2 Data and View Classes 187

9.3 The Game. 188

9.4 Card Piles{Inheritance in Action189

9.4.1 The Default Card Pile.191

9.4.2 The Suit Piles 192

9.4.3 The Deck Pile 192

9.4.4 The Discard Pile. 194

9.4.5 The Tableau Piles195

9.5 Playing the Polymorphic Game. 197

9.6 The Graphical User Interface.197

10 Subclasses and Subtypes 205

10.1 Substitutability. 205

10.2 Subtypes. 206

10.3 The Substitutability Paradox.208

10.3.1 Is This a Problem?210

10.4 Subclassing for Construction.210

10.4.1 Private Inheritance in C++*. 212

10.5 Dynamically Typed Languages. 213

10.6 Pre and Post conditions*214

10.7 Re nement Semantics* 214

11 Static and Dynamic Behavior 219

11.1 Static versus Dynamic Typing.219

11.2 Static and Dynamic Classes.221

11.2.1 Run Time Type Determination223

11.2.2 Down Casting (Reverse Polymorphism)223

11.2.3 Run Time Testing without Language Support* . 226

11.2.4 Testing Message Understanding227

11.3 Static versus Dynamic Method Binding. 227

12 Implications of Substitution 233

12.1 Memory Layout. 233

12.1.1 Minimum Static Space Allocation235

12.1.2 Maximum Static Space Allocation237

12.1.3 Dynamic Memory Allocation. 238

12.2 Assignment239

12.2.1 Assignment in C++*.240

12.3 Copies and Clones. 243

12.3.1 Copies in Smalltalk and Objective-C 243

12.3.2 Copy Constructors in C++ 243

12.3.3 Cloning in Java ..244

12.4 Equality.244

12.4.1 Equality and Identity.245

12.4.2 The Paradoxes of Equality Testing246

13 Multiple Inheritance 251

13.1 Inheritance as Categorization.252

13.1.1 Incomparable Complex Numbers. 252

13.2 Problems Arising from Multiple Inheritance 254

13.2.1 Name Ambiguity. 255

13.2.2 Impact on Substitutability257

13.2.3 Rede nition in Eiel*.258

13.2.4 Resolution by Class Ordering in CLOS*259

13.3 Multiple Inheritance of Interfaces261

13.3.1 Mixins in CLOS*. 263

13.4 Inheritance from Common Ancestors. 265

13.4.1 Constructors and Multiple Inheritance*268

13.5 Inner Classes 269

14 Polymorphism and Software Reuse 273

14.1 Polymorphism in Programming Languages273

14.1.1 Many Tools, One Goal.275

14.2 Mechanisms for Software Reuse. 275

14.2.1 Using Composition276

14.2.2 Using Inheritance. 278

14.2.3 Composition and Inheritance Contrasted279

14.3 E ciency and Polymorphism.281

14.4 Will Widespread Software Reuse Become Reality? 282

15 Overloading 285

15.1 Type Signatures and Scopes.285

15.2 Overloading Based on Scopes.287

15.3 Overloading Based on Type Signatures288

15.3.1 Coercion and Conversion291

15.4 Rede nition297

15.5 Polyadicity*299

15.5.1 Optional Parameters.301

15.6 Multi-Methods*. 302

15.6.1 Overloading Based on Values. 304

16 Overriding 307

16.0.2 Overriding in Smalltalk Class Magnitude308

16.1 Notating Overriding309

16.2 Replacement versus Re nement. 309

16.2.1 Replacement in Smalltalk311

16.2.2 Re nement in Beta313

16.2.3 Re nement and the Subclass/Subtype distinction 316

16.2.4 Wrappers in CLOS316

16.3 Deferred Methods317

16.4 Overriding versus Shadowing.318

16.5 Covariance and Contravariance. 321

16.6 Variations on Overriding*326

16.6.1 Final methods in Java.326

16.6.2 Versioning in C#. 327

17 The Polymorphic Variable 331

17.1 Simple Polymorphic Variables.331

17.2 The Receiver Variable 333

17.2.1 The role of the polymorphic variable in frameworks . 334

17.2.2 Endpoint comparisons in Smalltalk336

17.2.3 Self and Super 337

17.3 Downcasting 339

17.4 Pure Polymorphism341

18 Generics 345

18.1 Template Functions345

18.2 Template Classes347

18.2.1 Bounded Genericity*.349

18.3 Inheritance in Template Arguments*. 349

18.3.1 Inheritance and Arrays. 351

18.4 Case Study-Combining Separate Classes. 352

19 Container Classes 359

19.1 Containers in Dynamically Typed Languages. 359

19.1.1 Containers in Smalltalk-80 360

19.2 Containers in Statically-Typed Languages361

19.2.1 The Tension between Typing and Reuse362

19.2.2 Substitution and Downcasting364

19.2.3 Using Substitution and Overriding368

19.2.4 Parametrized Classes.370

19.3 Restricting Element Types*.371

19.4 Element Traveral374

19.4.1 Iterator loops375

19.4.2 The Visitor Approach.377

20 A Case Study: The STL 385

20.1 Iterators.387

20.2 Function Objects388

20.3 Example Program{An Inventory System. 390

20.4 Example Program{Graphs392

20.4.1 Shortest Path Algorithm. 394

20.4.2 Developing the Data Structures394

20.5 A Concordance. 398

20.6 The Future of OOP401

21 Frameworks 403

21.1 Reuse and Specialization. 403

21.1.1 High and low level abstractions406

21.1.2 An Upside Down Library408

21.2 Example Frameworks409

21.2.1 The Java Applet API.409

21.2.2 A Simulation Framework410

21.2.3 An Event-Driven Simulation Framework411

22 An Example Framework: The AWT and Swing 419

22.1 The AWT Class Hierarchy ...419

22.2 The Layout Manager422

22.3 Listeners.424

22.3.1 Adapter Classes. 425

22.4 User Interface Components.426

22.5 Case Study: A Color Display.429

22.6 The Swing component library.432

22.6.1 Import Libraries. 433

22.6.2 Dierent Components.433

22.6.3 Dierent Paint Protocol. 433

22.6.4 Adding Components to a Window434

23 Object Interconnections 435

23.1 Coupling and Cohesion 436

23.1.1 Varieties of Coupling.436

23.1.2 Varieties of Cohesion.439

23.1.3 The Law of Demeter.440

23.1.4 Class-Level versus Object-Level Visibility442

23.1.5 Active Values442

23.2 Subclass Clients and User Clients444

23.3 Control Of Access and Visibility445

23.3.1 Visibility in Smalltalk.445

23.3.2 Visibility in Object Pascal445

23.3.3 Visibility in C++.446

23.3.4 Visibility in Java. 450

23.3.5 Visibility in Objective-C. 452

23.4 Intentional Dependency. 453

24 Design Patterns 457

24.1 Controlling Information Flow.458

24.2 Describing Patterns459

24.3 Iterator.460

24.4 Software Factory461

24.5 Strategy.462

24.6 Singleton. 462

24.7 Composite. 463

24.8 Decorator. 465

24.9 The Double-Dispatching Pattern466

24.10Flyweight. 467

24.11Proxy.468

24.12Facade.469

24.13Observer.469

25 Re ection and Introspection 473

25.1 Mechanisms for Understanding. 473

25.1.1 Class Objects473

25.1.2 The Class Name as String475

25.1.3 Testing the Class of an Object475

25.1.4 Creating an Instance from a Class477

25.1.5 Testing if an Object Understands a Message 478

25.1.6 Class Behavior 478

25.2 Methods as Objects479

25.3 Mechanisms for Modi cation.480

25.3.1 Method Editing in Smalltalk. 480

25.3.2 Dynamic Class Loading in Java481

25.4 Metaclasses483

26 Distributed Objects 487

26.1 Addresses, Ports, and Sockets.488

26.2 A Simple Client/Server Program490

26.3 Multiple Clients. 493

26.4 Transmitting Objects over a Network. 498

26.5 Providing More Complexity.501

27 Implementation 505

27.1 Compilers and Interpreters.505

27.2 The Receiver as Argument506

27.3 Inherited Methods. 507

27.3.1 The Problem of Multiple Inheritance 508

27.3.2 The Slicing Problem.508

27.4 Overridden Methods509

27.4.1 Eliminating Virtual Calls and Inlining. 511

27.5 Name Encoding. 511

27.6 Dispatch Tables. 512

27.6.1 A Method Cache. 513

27.7 Bytecode Interpreters 514

27.8 Just-In-Time Compilation517

A Source for the Eight-Queens Puzzle 521

A.1 Eight-Queens in Apple Object Pascal. 521

A.2 Eight-Queens in C++. 524

A.3 Eight-Queens in Java526

A.4 Eight-Queens in Objective-C.529

A.5 Eight-Queens in Ruby 532

A.6 Eight-Queens in Smalltalk534

B Source for the Billiards Game 537

B.1 The Version without Inheritance537

B.2 The Version with Inheritance.545

C Source for the Solitaire Game 551

Glossary 563

Index 595