home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / comp / object / 5025 < prev    next >
Encoding:
Text File  |  1993-01-23  |  48.6 KB  |  1,094 lines

  1. Newsgroups: comp.object
  2. Path: sparky!uunet!charon.amdahl.com!netcomsv!netcom.com!objsys
  3. From: Bob Hathaway <objsys@netcom.com>
  4. Subject: FAQ (Part 1 of 2)
  5. Message-ID: <1993Jan23.071036.141@netcom.com>
  6. Keywords: FAQ
  7. Sender: objsys@netcom.com (Object Systems)
  8. Organization: Object Systems
  9. Date: Sat, 23 Jan 1993 07:10:36 GMT
  10. Lines: 1082
  11.  
  12. Hello Netters,
  13.  
  14. I'm posting this incomplete FAQ (we're still not done arguing yet) because,
  15. unfortunately, I'm leaving Object Systems (and my ultimate C++ superset) for
  16. this hot little company doing even more dynamic and profound things in the
  17. object model.  The FAQ will still undergo major revision.  Anyway, I should
  18. be able to pick up from there a little later...
  19.  
  20. bob
  21. objsys@netcom.com
  22.  
  23. P.S.  Thanks for the many encouraging letters.  They help me to continue
  24. working on the FAQ whenever I can...
  25.  
  26.  
  27. COMP.OBJECT FAQ
  28. Version: -1.0.2 (PRE-DRAFT RELEASE - REQUEST FOR COMMENTS)
  29. Date:    1/22/1993
  30.  
  31. Author:
  32.   Bob Hathaway
  33.   Object Systems
  34.   objsys@netcom.com
  35.  
  36. Anonymous FTP Site for FAQ: YTBA
  37. Anonymous FTP Site for comp.object: ???
  38.  
  39. Copyright January 10, 1992 by Bob Hathaway.
  40. Permission is granted to freely copy and distribute this document but only at
  41. no cost to others and with the exception of a nominal distribution fee, if
  42. any.  No sale, resale or reprinting is granted without the explicit written
  43. permission of the author.
  44.  
  45. Contributors:  Stewart Clamen, Mike DeVaney, Paul Johnson, Ronald C. Schultz,
  46.   Bill Kinnersley, Piercarlo Grandi and many others whose names and
  47.   contributions will be added soon.
  48.  
  49. Objective:
  50.   In the spirit of other FAQs, to provide a simple document to answer the most
  51.   frequently asked and recurring questions and to allow new users to understand
  52.   frequently discussed topics and terms used in comp.object.   This should
  53.   bring new comp.object readers and/or writers to at least an introductory
  54.   level of comprehension as soon as possible.  Other goals (hopes) are to
  55.   provide a quick and current reference on available systems such as object-
  56.   oriented languages, CASE, OODB and etc. and to provide good references to
  57.   current and relevant texts.
  58.  
  59. Disclaimer:
  60.   This document does not reflect the opinions of the author's or any
  61.   contributor's companies.  There are no explicit or implicit guarantees
  62.   implied by this document.
  63.  
  64. BASICS:
  65.   What Is an Object?
  66.   What Is Object Encapsulation (or Protection)?
  67.   What Is a Class?
  68.   What Is a Meta-Class?
  69.   What Is Infinite Regress?
  70.   What are MOPs and Reflection?
  71.   What Is Inheritance?
  72.   What Is Multiple Inheritance?
  73.   Does Multiple Inheritance Pose any Additional Difficulties?
  74.   What Is Dynamic Inheritance?
  75.   What Is Shared (Repeated) Inheritance?
  76.   Why use Inheritance?
  77.   Why Don't Some People Like Inheritance?
  78.   What Is Specialization/Generalization/Overriding?
  79.   What Is the Difference Between Object-Based and Object-Oriented?
  80.   Is a Class an Object?
  81.   Is an Object a Class?
  82.   What Is a Method? (and Receiver and Message)
  83.   What Are Multi-Methods?
  84.   Can I use Multi-Methods in C++?
  85.   What Is OOP?
  86.   What Is OOA/OOD (and where can I get what I need on it)?
  87.   Where Did Object-Orientation Come From?
  88.   What Are the Benefits of Object-Orientation?
  89.   What other FAQs are available?
  90.  
  91. TYPING:
  92.   What Is Polymorphism?
  93.   What Does Polymorphism Boil Down To in Object-Oriented Programming Languages?
  94.   What Is Dynamic Binding?
  95.   Is There a Difference Between Being a Member or Instance of a Class?
  96.   What Is This I Read About ML and Functional Programming Languages?
  97.   What Is the Difference Between Static and Dynamic Typing?
  98.   What Is the Separation Between Type and Class?
  99.   What Are Generics and Templates?
  100.  
  101. KINDS OF OO:
  102.   What Is the "Classical" Object-Oriented Paradigm?
  103.   What Is the "Delegation/Prototyping" Object-Oriented Paradigm?
  104.   Are There any Others Paradigms?
  105.  
  106. GENERAL:
  107.   What are the Major Languages in Object-Oriented Programming Today?
  108.   What are Object-Oriented Databases?
  109.   What are Object-Oriented Operating Systems?
  110.   What Are the Current Object-Oriented Methodologies?
  111.   What Is the OMG/ORA/...?
  112.   Why Is Garbage Collection a Good Thing?
  113.  
  114. COMMONLY ASKED LANGUAGE SPECIFIC QUESTIONS:
  115.   What Is Downcasting?
  116.   What are Virtual Functions?
  117.  
  118. ANNOTATED BIBLIOGRAPHY
  119.  
  120. APPENDIXES
  121.   APPENDIX A  VIPS
  122.   APPENDIX B  Object-Oriented Databases and Vendors
  123.   APPENDIX C  Object-Oriented Languages and Vendors
  124.   APPENDIX D  Object-Oriented CASE (OOA/D/P Tools) and Vendors
  125.   APPENDIX E  Anonymous FTP sites
  126.   APPENDIX F  Magazines, Journals and Lewsletters
  127.  
  128.  
  129. BASICS
  130. ======
  131.  
  132. Suggested Readings:
  133.   [Booch 91]
  134.   Others to be added...
  135.  
  136. What Is an Object?
  137.  
  138. There are many definitions of an object, such as found in [Booch 91, p77]:
  139. "An object has state, behavior, and identity; the structure and behavior of
  140. similar objects are defined in their common class; the terms instance and
  141. object are interchangeable".  This is a "classical languages" definition, as
  142. defined in [Coplien 92, p280], where "classes play a central role in the
  143. object model", since they do not in prototyping/delegation languages.  
  144. "The term object was first formally applied in the Simula language, and
  145. objects typically existed in Simula programs to simulate some aspect of
  146. reality" [Booch 91, p77].  Other definitions referenced by Booch include
  147. Smith and Tockey [see Booch 91]: "an object represents an individual,
  148. identifiable item, unit, or entity, either real or abstract, with a well-
  149. defined role in the problem domain." and Cox[Ref]: "anything with a crisply
  150. defined boundary".  Booch goes on to describe these definitions in depth.
  151.  
  152. In symbolic languages, such as Smalltalk and Lisp-based systems, variables are
  153. loosly bound to objects, and can be viewed as labels referring to objects.
  154.  
  155. The implementation of objects could be categorized into descriptor-based,
  156. capability-based, and simple static-based approaches.  Descriptor-based
  157. approaches (e.g. Smalltalk handles) allow symbolic programming, capability-
  158. based approaches are found in object-oriented databases and operating systems
  159. (object id's) and simple static approaches are found in languages such
  160. as C++.
  161.  
  162. Below is a simple example of statically typed objects from a conventional
  163. procedural programming point of view intended to show new users one of the
  164. simplist cases of objects in terms of something they may already be familiar
  165. with, conventional programming (and BTW, object-oriented programming is
  166. procedural because of its functional/behavioral interfaces and implementations
  167. (see methods)):
  168.  
  169. Simple statically-typed objects can be viewed as instances of a record type,
  170. whose record fields are called instance variables (Smalltalk) or member data
  171. (C++).  The record (class) may also contain operations which are called
  172. methods (Smalltalk) or member functions (C++) which are equivalent to a
  173. function taking an object of the record type, called the receiver, as the
  174. first parameter.  The receiver is called self (Smalltalk) or this (C++).
  175. Members will denote both instance variables and methods.  Inheritance is
  176. roughly equivalent to a loosly coupled variant record, with derived classes
  177. as variant parts and with multiple-inheritance concatenating several records
  178. to serve as a base.  Pointers, references and access types are simple examples
  179. of symbolic programming, where pointer objects are not tightly bound to the
  180. objects they denote.  Since most symbolic languages are statically typeless
  181. (or just "typeless") but have dynamic types, an untyped pointer (such as void*
  182. in C++) and an embedded dynamic type scheme must be used in conventional
  183. languages to fully emulate symbolic programming.
  184.  
  185. The terms method/member function, instance variable/member data, subclass/
  186. derived class, parent class/base class, and etc. will be used interchangeably.
  187. As pointed out in [Stroustrup 91, p197], the base/derived class terminology
  188. may be preferable to the sub/super-class terminology, and is preferred in
  189. this document also.
  190.  
  191. Delegation/prototyping languages have a more flexible kind of object which
  192. can play the role of classes in classical languages.  Since there is no
  193. separate class construct in these languages, they are referred to as single-
  194. hierarchy, or 1 Level systems.  Objects contain fields, methods and delegates
  195. (pseudo parents), whereas classical object-oriented languages associate
  196. method, field and parent definitions with classes (and only associate state,
  197. and class with objects).  Typical 1 Level objects can contain any number of
  198. fields, methods and parents and any object can be used as a template/exemplar,
  199. thus performing the classical role of a class.  In typical prototyping
  200. systems, parents (as any other member) can be added dynamically, providing
  201. dynamic multiple inheritance.  It is common in such systems for an object to
  202. "become" another kind of object by changing its parent.  An good example is a
  203. window becoming an icon, since window and icon objects display different
  204. behavior.  Delegation refers to delegating the search for an attribute to
  205. a delegate, and is therefore more of a pure message passing mechanism than
  206. inheritance.
  207.  
  208. 1 Level systems therefore provide the most flexible and powerful capabilities.
  209.  
  210.  
  211. What Is Object Encapsulation (or Protection)?
  212.  
  213. Some languages permit arbitrary access to objects and allow methods to be
  214. defined outside of a class (as in CLOS, but with voluntary restrictions)
  215. giving users complete access to objects.  However most object-oriented
  216. languages provide a well defined interface to their objects thru classes.
  217. C++ has a very general protection mechanism with public, private and protected
  218. members.  Public members (member data and member functions) may be accessed
  219. from anywhere.  A Stack's Push and Pop methods will be public.  Private
  220. members are only accessible from within a class.  A Stack's representation,
  221. such as a list or array, will usually be private.  Protected members are
  222. accessible from within a class and also from within subclasses (also called
  223. derived classes).  A Stack's representation could be declared protected
  224. allowing subclass access.
  225.  
  226. For another example, Smalltalk's class instance variables are not accessible
  227. from outside of their class (they are not only private, but invisible).
  228. Smalltalk's methods are all public (can be invoked from anywhere), but a
  229. private specifier indicates methods should not be used from outside of the
  230. class.  All Smalltalk instance variables can be accessed by subclasses (this
  231. helps with abstract classes and overriding).
  232.  
  233.  
  234. What Is a Class?
  235.  
  236. There are many definitions of a class, such as [Booch 91, p93], "a group, set,
  237. or kind marked by common attributes or a common attribute; a group division,
  238. distinction, or rating based on quality, degree of competence, or condition"
  239. and Booch's definition in the context of object-oriented design "A class is a
  240. set of objects that share a common structure and a common behavior."  "A
  241. single object is simply an instance of a class."
  242.  
  243. In more pragmatical programming terms, a Class is a specification of structure
  244. (instance variables), behavior (methods), and inheritance (parents, or
  245. recursive structure and behavior).  As pointed out above, classes can also
  246. specify access permissions for clients and derived classes.
  247.  
  248.  
  249. What Is a Meta-Class?
  250.  
  251. A Meta-Class is a class' class.  If a class is an object, then that object
  252. must have a class (in classical OO anyway).  Compilers provide an easy way to
  253. picture Meta-Classes.  Classes must be implemented in some way; perhaps with
  254. dictionaries for methods, instances, and parents and methods to perform all
  255. the work of being a class.  This can be declared in a class named "Meta-Class".
  256. The Meta-Class can also provide services to application programs, such as
  257. returning a set of all methods, instances or parents for review (or even
  258. modification).  In Smalltalk, the situation is more complex.  To make this
  259. easy, refer to the following:
  260.  
  261. 1 Level System
  262.   All objects can be viewed as classes and all classes can be viewed as
  263.   objects (as in Self).  There is no need for Meta-Classes because objects
  264.   describe themselves.  Also called "single-hierarchy" systems.
  265. 2 Level System
  266.   All Objects are instances of a Class but these are not accessible to
  267.   programs (no Meta-Class except for in the compiler and perhaps for type-safe
  268.   linkage, as in C++).  Also called "dual-hierarchy" systems.
  269. 3 Level System
  270.   All objects are instance of a class and all classes are instances of
  271.   Meta-Class.  The Meta-Class is a class and is therefore an instance of
  272.   itself (really making this a 3 1/2 Level System).  This allows classes to
  273.   be first class objects and therefore classes are available to programs.
  274. 5 Level System
  275.   What Smalltalk provides.  Like a 3 Level System, but there is an extra level
  276.   of specialized Meta-Classes for classes.  There is still a Meta-Class as in 
  277.   a 3 Level System, but as a class it also has a specialized Meta-Class, the
  278.   "Meta-Class class" and this results in a 5 Level System: 
  279.     object
  280.     class
  281.     class class (Smalltalk's Meta-Classes)
  282.     Meta-Class
  283.     Meta-Class class
  284.  
  285.  
  286. What Is Infinite Regress?
  287.  
  288. In the authors opinion, a myth.  The story goes a class has a Meta-Class,
  289. which must also have a Meta-Meta-Class, which must also have a
  290. Meta-Meta-Meta-Class ...  The trick is to have a loop at the end, as with a
  291. Meta-Class pointing to itself, or to have a "Meta-Class - Meta-Class class"
  292. loop (as in Smalltalk).
  293.  
  294.  
  295. What Are MOPs and Reflection?
  296.  
  297. MOP is an acronym for Meta-Object Protocol.  This is a system with
  298. Meta-Classes accessible to users.  An introspective protocol provides a read
  299. only capability (e.g. what is this object's class, give info on this class,
  300. etc.) and an intercessory protocol provides a write capability which allows
  301. system modification (e.g. add the following method or instance to this class,
  302. perform inheritance this way, etc.).  Because inheritance can be used to
  303. perform differential changes, intercessory protocols allow users to not only
  304. define new frameworks but to specialize existing system frameworks
  305. differentially without affecting them and their extant objects.  Thus, many
  306. frameworks can interoperate together simultaneously.
  307.  
  308. "Reflective" systems are systems with MOPs (not to be confused with reflexive
  309. systems, which often refer to systems implemented in terms of themselves, or
  310. bootstrapped).
  311.  
  312.  
  313. What Is Inheritance?
  314.  
  315. Inheritance is a relationship between classes where one class is the
  316. parent (or base) class of another.  Inheritance can be used as an
  317. is-a-kind-of relationship or for differential programming.  Inheritance
  318. also doubles for assignment compatibility (see What is the difference
  319. between Type and Class?).  
  320.  
  321. An example of the is-a-kind-of (is-a can be used synonymously, but is often
  322. used to show the "object is-a class" instantiation relationship.  In classical
  323. OO, is-a-kind-of is a relationship between classes only) relationship is as
  324. follows:
  325.  
  326.                                Computer
  327.                               /    |     \
  328.                        Mainframe  Mini    Personal
  329.                         /    \    ...       /   \
  330.                   Data Proc  Scientific   PC    Workstation
  331.  
  332. Class hierarchies are subjective and usually drawn with the parent class on
  333. top, but more demanding graphs (as is often the case in [Rumbaugh 91]) often
  334. allow any topology, with the head of an arrow indicating the parent (base)
  335. class and the tail indicating the subclass (derived) class.
  336.  
  337. Differential programming is the use of inheritance to make a small change to
  338. a class.  Creating a subclass to alter a method or to add a method to
  339. a parent class is an example of differential programming.
  340.  
  341. A Parent class is called a base class and a subclass is called a derived
  342. class in C++, these terms are used interchangeably here.
  343.  
  344.  
  345. What Is Multiple Inheritance?
  346.  
  347. Multiple Inheritance occurs when a class inherits from more than one parent.
  348.  
  349.  
  350. Does Multiple Inheritance Pose any Additional Difficulties?
  351.  
  352. Yes, it does.  Any name can be simply resolved to a class member with single
  353. inheritance by simply accessing the first name encountered for data members
  354. and for accessing the first signature match (or ambiguity) encountered for
  355. methods (at least one way, C++ hides some member functions).  Since several
  356. parents can declare a member, which to choose becomes an issue.  Eiffel forces
  357. derived classes to rename parent members that conflict.  Self prioritizes
  358. parents.  CLOS merges member "slots" (instance variables) with the same name
  359. into a single slot.  C++ declares an error iff a conflict arises (but a class
  360. qualifier can be used to explicitly disambiguate).
  361.  
  362.  
  363. What Is Dynamic Inheritance?
  364.  
  365. Dynamic inheritance refers to the ability to add, delete, or change parents
  366. from objects (or classes) at run-time.  1 Level Systems typically provide
  367. dynamic inheritance.  In many systems these parents can be any object; however,
  368. so objects acting as classes are often "cloned" to provide unshared or unique
  369. attributes.
  370.  
  371.  
  372. What Is Shared (Repeated) Inheritance?
  373.  
  374. Multiple Inheritance brings up the possibility for a class to appear as a
  375. parent more than once in a class graph (repeated inheritance), and there is
  376. then a potential to share that class.  Only one instance of the class will
  377. then appear in the graph (as is always the case in CLOS, because all *members*
  378. with the same name will be shared (receive a single slot) with the greatest
  379. common subtype as its type.  C++ provides an alternative, where only parents
  380. specified as virtual (virtual bases) are shared within the same class lattice,
  381. allowing both shared and non-shared occurrences of a parent to coexist.  All
  382. "features" in Eiffel (C++ members) of a repeated parent that are not to be
  383. shared must be renamed "along an inheritance path", else they are shared by
  384. default.  This allows a finer granularity of control but requires more work
  385. for parents with many fetaures.
  386.  
  387.  
  388. Why Use Inheritance?
  389.  
  390. Inheritance provides for code and structural reuse.  In the above Computer
  391. class diagram, all routines and structure available in class Computer are
  392. available to all subclasses throughout the diagram.  All attributes available
  393. in Personal computers are also available to all of its subclasses.  This kind
  394. of reuse takes advantage of the is-a-kind-of relationship.
  395.  
  396. With differential programming, a class does not have to be modified if it is
  397. close to what's required; a derived class can be created to specialize it.
  398. This avoids code redundancy, since code would have to be copied and modified
  399. otherwise.
  400.  
  401.  
  402. Why Don't Some People Like Inheritance?
  403.  
  404. Some people complain that inheritance is hierarchical (which is what most
  405. object-oriented languages provide).  They would also like to see more
  406. operations available (set operations are quite common in specialized systems).
  407. These are really language dependent features commonly found in object-oriented
  408. languages which are then associated with the term "inheritance" (although
  409. they don't need to be).  Some don't like the coupling of classes (as in Jade),
  410. but in the author's opinion many of their complaints are easily answered.
  411. In systems that provide inheritance, inheritance provides a simple and elegant
  412. way to reuse code and to model the real world in a meaningful way.
  413.  
  414. Others complain multiple inheritance is too complicated because it brings up
  415. the issues of shared bases and member conflict resolution.  But most modern
  416. systems support Multiple Inheritance by employing semantic resolution
  417. strategies, and many consider MI to be highly desirable.
  418.  
  419.  
  420. What Is Specialization/Generalization/Overriding?
  421.  
  422. To create a subclass is specialization, to factor out common parts of
  423. derived classes into a common base (or parent) is generalization [Booch 91,
  424. p56].  Overriding is the term used in Smalltalk and C++ for redefining a
  425. (virtual in Simula and C++) method in a derived class, thus providing
  426. specialized behavior.  All routines in Smalltalk and Eiffel are overridable
  427. (although in Eiffel they must be "redefined" in a derived class).  Whenever
  428. a method is invoked on an object of the base class, the derived class method
  429. is executed overriding the base class method, if any.  Overriding in Simula
  430. is a combination of overloading and multi-methods because parameters do not
  431. have to be declared.
  432.  
  433.  
  434. What Is the Difference Between Object-Based and Object-Oriented?
  435.  
  436. Object-Based Programming usually refers to objects without inheritance
  437. [Cardelli 85] and hence without polymorphism, as in '83 Ada and Modula-2.
  438. Proposed '93 Ada and Modula-3; however, support inheritance and polymorphism.
  439. [Cardelli 85, p481] state "that a language is object-oriented if and only if
  440. it satisfies the following requirements:
  441.   - It supports objects that are data abstractions with an interface of named
  442.     operations and a hidden local state.
  443.   - Objects have an associated type [class].
  444.   - Types [classes] may inherit attributes from supertypes [superclasses].
  445.  
  446. These definitions are also found in [Booch 91, Ch2].  A more modern definition
  447. includes single hierarchy languages and perhaps object id's for unique objects.
  448. Object id's support the more modern notion of relocatable, persistent and
  449. distributed objects that can even migrate across machines.
  450.  
  451.  
  452. Is a Class an Object?
  453.  
  454. In C++ no, because C++ classes are not instances of an accessible class (a
  455. Meta-Class) and because C++ classes are not accessible to programs.  Classes
  456. are objects in 3 Level Systems and above because classes have Meta-Classes
  457. and can therefore be accessed in the same way as any other object.  But
  458. classes play a dual role, because objects can only be declared to be instances
  459. of a class.  In 1 Level (single hierarchy) systems, all classes are objects,
  460. so to speak.
  461.  
  462.  
  463. Is an Object a Class?
  464.  
  465. In a Level 3 System and above yes, but only instances of a Meta-Class
  466. are Classes.  Instances of a Class (ordinary objects) are not classes.
  467. However, all objects may be classes in single hierarchy systems, since any
  468. object may act as a class (provide object instantiation).  If done directly,
  469. this object may be shared among many class graphs.  To get the effect of a
  470. typical parent (e.g. if instance variables are shared), the class object
  471. is usually cloned and then made a parent.
  472.  
  473.  
  474. What Is a Method? (and Receiver and Message)
  475.  
  476. A method is a function or procedure which is defined in a class and can
  477. access the internal state of an object of that class to perform some
  478. operation.  It can be thought of as a procedure with the first parameter
  479. as the object to work on.  This object is called the receiver, which is the
  480. object the method operates on.  The following are some common notations for
  481. invoking a method, and this invocation is called a message (or message
  482. passing):
  483.  
  484.   receiver.message_name(a1, a2, a3)   
  485.   receiver message_name: a1 parm1: a2 parm3: a3
  486.  
  487. Selector would be another good choice for message_name in the above examples,
  488. although the keywords (or formal parameter names, like named parameters) are
  489. considered part of the selector in Smalltalk.
  490.  
  491. A method implements behavior, which is defined by [Booch 91, p80]:
  492.  
  493.   Behavior is how an object acts and reacts, in terms of its state changes
  494.   and message passing.
  495.  
  496.  
  497. What Are Multi-Methods?
  498.  
  499. In Multi-Methods all parameters are used in the selection of a method
  500. (multiple-polymorphism).  The name comes from CLOS, a language with both
  501. static and dynamic typing.  CLOS does not distinguish a receiver and
  502. typically associates a method with the classes of all specialized parameters.
  503. While the notion of multi-methods originally comes from such loosly coupled
  504. methods and classes, the idea also applies to classical object-oriented
  505. languages.  Statically-typed languages such as C++ place restrictions on
  506. parameters, so that overriding methods must have identical signatures with the
  507. methods they substitute.  If this restriction is dropped, a Multi-Method
  508. capability is available.  With Multi-Methods, a single overridable function
  509. declared in a base class may have several functions overriding it in a derived
  510. class differentiated only by their formal argument types.  Therefore multi-
  511. methods require both static and dynamic typing, because no formal argument
  512. differentiation is possible without static types and no actual argument
  513. differentiation would be possible without dynamic types.
  514.  
  515. There is some concern about the efficiency of run-time method selection
  516. as can occur with multi-methods.  However, static analysis optimizations are
  517. commonly available in the literature, potentially providing a single static
  518. selection in certain cases.  But coupling the two cases of unknown selectors
  519. (as found in CLOS and other dynamic languages) and several possible known
  520. selectors together with the undecidability of dynamic types at run-time
  521. renders dynamic typing and run-time selection (or checking) as unavoidable in
  522. the general case [a point often mistaken in comp.object].
  523.  
  524.  
  525. Can I use Multi-Methods in C++?
  526.  
  527. Yes, but you'll need to embed a dynamic typing scheme to do it.  With
  528. dynamic types in place, an overriding method in a derived class can explicitly
  529. check argument types in a switch statement and invoke the desired method
  530. [Coplien 92].  Future FAQs should contain more detail.
  531.  
  532.  
  533. What is OOP?
  534.  
  535. OOP stands for Object-Oriented Programming, the usual programming/hacking and
  536. etc. most programmers think of.
  537.  
  538.  
  539. What Is OOA/OOD (and where can I get what I need on it)?
  540.  
  541.   See also "What Are the Current Object-Oriented Methodologies?", the
  542.   Annotated Bibliography, and APPENDIX D  Object-Oriented CASE (OOA/D/P Tools)
  543.   and Vendors.
  544.  
  545. OOA and OOD stand for Object-Oriented Analysis and Object-Oriented Design,
  546. respectively.  To generalize (since these terms differ between systems),
  547. OOA analyzes the problem domain in terms of objects and classes, while OOD
  548. reflects the system to be built in the same terms.  The usual progression is
  549. from OOA to OOD to OOP.  Since classes and objects are used in all phases,
  550. the process is often referred to as seamless, meaning there is no conceptual
  551. or even actual gap or hiatus between them as is often the case in other
  552. software development methodologies.
  553.  
  554. OOA and OOD differ from OOP in that the notations are graphical instead of
  555. the usual textual declarative form.  This allows easier visualization and
  556. makes dependencies more explicit.  For example, an association is an annotated
  557. and labeled line connecting classes in an OOA or OOD diagram, but is often
  558. a pointer declaration (or an instance of another class) in OOP ([Rumbaugh 91]
  559. explicitly addresses the implementation of associations in several sections).
  560.  
  561. An OO problem domain has many realizations, or differing OOAs.  An OOA has
  562. many realizations, or differing OODs, but a similar notation is often used
  563. for the two.  An OOD also has many realizations, or differing OOPs, but allows
  564. a selection from among various languages for implementation (choosing the best
  565. language to implement the design).  But some, such as Bjarne Strostrup, don't
  566. like OOA and OOD getting too far from OOP (implementation independent), for
  567. fear that great discrepancies could occur between OOD and OOP by losing sight
  568. of the implementation language, which in some cases is predetermined.
  569.  
  570.  
  571. Where Did Object-Orientation Come From?
  572.  
  573. Simula was the first object-oriented language because it provided facilities
  574. such as classes, inheritance, and dynamic typing back in 1967 (in addition to
  575. its Algol-60 subset).  Simula 1 was a simulation language, and the later
  576. general-purpose language Simula 67 is now referred to as simply Simula.
  577. Smalltalk was the next major contributor which included classes, inheritance,
  578. a nice environment and a powerful dynamic typing mechanism.
  579.  
  580.  
  581. What Are the Benefits of Object-Orientation?
  582.  
  583. Reuse, quality, an emphasis on modeling the real world (or a "stronger
  584. equivalence" with the RW than other methodologies), a consistent and seamless
  585. OOA/OOD/OOP package, naturalness (our "object concept") and etc.
  586.  
  587.  
  588. What Other FAQs Are Available?
  589.  
  590. There are also FAQ's for comp.lang.c++, comp.lang.eiffel, and comp.lang.clos
  591. (more should be added soon).
  592.  
  593.  
  594. TYPING
  595. ======
  596.  
  597.   References
  598.     [Booch 91]        Small Section on Typing.
  599.     [Cardelli 85]    Discussion on Object-Oriented Typing.
  600.     [Kim 89, ch1]    Discussion on Some Research Topics.
  601.  
  602. What Is Polymorphism?
  603.  
  604. For a Brief Answer:
  605. Polymorphism is the ability of an object to assume or become many different
  606. forms of object and for these various forms to exhibit explicit phenotype-
  607. like expression.  Inheritance (or delegation) specifies slightly different or
  608. additional structure or behavior for an object, and these more specific or
  609. additional attributes of an object of a base class when assuming or becoming
  610. an object of a derived class characterizes object-oriented polymorphism.  This
  611. is a special case of parametric polymorphism, which allows an object to assume
  612. or become any object (possibly satisfying some implicit or explicit type
  613. constraints (parametric type), or a common structure) and not just objects of
  614. derived classes.
  615.  
  616. For a More Detailed Answer:
  617. "Poly" means "many" and "morph" means "form".  The homograph polymorphism has
  618. many uses in the sciences, all referring to objects that can take on or assume
  619. many different forms.  Computer Science refers back to Strachey's original
  620. definitions of polymorphism, as divided into two major forms, parametric and
  621. ad-hoc.  "Parametric polymorphism is obtained when a function works uniformly
  622. on a range of types; these types normally exhibit some common structure.  Ad-
  623. hoc polymorphism is obtained when a function works, or appears to work, on
  624. several different types (which may not exhibit a common structure) and may
  625. behave in unrelated ways for each type."  Parametric polymorphism is also
  626. referred to as "true" polymorphism, whereas ad-hoc polymorphism isn't.
  627. These definitions are functional in nature, whereas the brief answer
  628. is a more object-oriented definition.
  629.  
  630. Another definition of polymorphism is proposed by Cardelli and Wegner;
  631. however, they tie parametric polymorphism to static typing which leads
  632. to generics, a static implementation technique.  The original definitions
  633. do not have any such restriction and so the author feels their definitions
  634. are not as general as the original ones.  [Cardelli 85] does; however, give
  635. a good discussion on object-orientation and on the separation between type
  636. and class, as is typically found in the modern formal type systems based on
  637. the typed lambda calculus notation.
  638.  
  639. Inclusion polymorphism can refer to subtyping, or having at least as much
  640. or more than is required.  Since derived classes inherit structure and
  641. behavior from base classes, such inheritance is an example of inclusion
  642. polymorphism with respect to representation.  An example of inclusion
  643. polymorphism with respect to assignment (and initialization) occurs when 
  644. object types may be specified statically and assignment is based on actual
  645. object membership in that type (often of the CLOS is-a-member-of form in OO).
  646. Emerald is an example of an object-oriented language that uses inclusion
  647. polymorphism to cover the general parametrically polymorphic case, since
  648. Emerald has a separation between type and class.  They refer to this as
  649. "best-fitting" types.
  650.  
  651.  
  652. What Does Polymorphism Boil Down to in Object-Oriented Programming Languages?
  653.  
  654. In C++, virtual functions provide polymorphism.  This is because a formal
  655. object (pointer or reference (or such parameter)) is polymorphically assignment
  656. compatible with any derived class.  Is this polymorphism in itself?  Objects
  657. can take on objects of different forms (the derived classes), but of what use
  658. is it?  To make any difference, the differing forms must have some effect.  In
  659. dynamically typed languages, actual objects are passed messages and will
  660. respond in whatever way the actual object has defined (usually starting
  661. from its most derived class and working its way up).  But for static objects,
  662. a virtual function is invoked.  This is the stored method from the derived
  663. class that overrode the virtual method from its base class, providing
  664. specialized behavior for the formal object; and hence, polymorphism.
  665.  
  666.  
  667. What Is Dynamic Binding?
  668.  
  669. Dynamic binding has two forms, static and dynamic.  Static dynamic binding
  670. is found in statically-typed languages such as C++, in virtual functions.
  671. When a class with virtual functions is used, it is not known which
  672. function will be called at run-time since a derived class may override
  673. the function, in which case the overriding function must be called.
  674. Statically determining all possibilities of usage is undecidable.  When
  675. the complete program is compiled, all such functions are resolved (statically)
  676. for actual objects. Formal object usage must have a consistent way of accessing
  677. these functions, as achieved thru vtables of function pointers in the actual
  678. objects (C++) or equivalent, providing statically-typed dynamic binding.
  679.  
  680. The run-time selection of messages is another case of dynamic binding, meaning
  681. lookup is performed (bound) at run-time (dynamically).  Various optimizations
  682. exist for dynamic lookup to increase efficiency.
  683.  
  684.  
  685. Is There a Difference Between Being a Member or Instance of a Class?
  686.  
  687. Yes (but be careful of context).  To use C++ terminology, an actual object
  688. is defined to be an instance of exactly one class (in classical OO), called
  689. its most derived class.  That actual object is called the complete object.
  690. An actual object is a member of (CLOS terminology) several classes, including
  691. all of the classes its declared (or most derived) class inherits from.  With
  692. static typing, if a formal object is made to refer to an actual object, that
  693. actual object must be a member of the formal object's class.
  694.  
  695. This provides a good example of differing definitions among object-oriented
  696. languages, since a member is defined as above in CLOS, but a member of a class
  697. is one of its instance variables in C++.
  698.  
  699.  
  700. What Is the Difference Between Static and Dynamic Typing?
  701.  
  702. Static typing means that there is type information used at compile-time.
  703. It is also often used to refer to languages that are strongly typed, that
  704. is no type information is needed at run-time.  Static typing is therefore
  705. more efficient and reliable, but loses power.  Typical restrictions include
  706. only allowing a common set of base class functions (or any common functions
  707. for the more general parametric polymorphic case) to be available on formal
  708. objects and a lack of multi-methods; both of which are overcome with dynamic
  709. typing.
  710.  
  711. Many languages provide dynamic typing: Smalltalk, Self, Objective-C, and etc.
  712. A limited dynamic typing scheme, called RTTI (Run Time Type Identification),
  713. is even being considered for the C++ standard.
  714.  
  715.  
  716. What Is This I Hear About ML and Functional Programming Languages?
  717.  
  718. ML, Milner's Language, is a functional programming language with a statically
  719. typed polymorphic type system.  We've already discussed why static typing is
  720. weaker than dynamic typing and the same applies to ML.  ML doesn't use
  721. inheritance for polymorphism; unlike OO languages, but provides a kind
  722. of inclusion polymorphism by allowing assignment compatibility for any object
  723. that can *at least* satisfy the required type constraints of a formal object,
  724. so no inheritance is required.  This is "true" or "pure" statically (or
  725. strongly) *checked* parametric polymorphism, by Strachey's definitions.
  726.  
  727. Smalltalk is an example of a dynamically-typed symbolic language which does
  728. not check types during assignment (and hence for parameters) and therefore
  729. provides parametric polymorphism without static constraints.
  730.  
  731.  
  732. What Is the Separation Between Type and Class?
  733.  
  734. In many OO languages, classes are used for assignment compatibility.  This
  735. forces all matching objects to inherit (transitively) from any formal object's
  736. class.  This insures that all operations to be performed on any formal object
  737. are satisfied by any matching object (and ultimately by any actual object).
  738.  
  739. By separating type and class (just one way of putting it), any matching object
  740. must satisfy the operations or type constraints of a formal object, but do not
  741. have to do so by an inheritance relation.  There are several ways of
  742. implementing inheritance on the "typing" side, one is to simply allow reuse of
  743. parent types and require all operations in the formal type graph to be present
  744. in any actual object.  Inheritance on the representation side is what most
  745. object-oriented programmers think of, because representation classes usually
  746. double for parametric-style typing.
  747.  
  748. Formal type systems (such as found in ML), Emerald/Jade and trellis/Owl all
  749. possess a separation between type and class.
  750.  
  751.  
  752. What are Generics and Templates?
  753.  
  754. Generics (or Templates in C++) refer to the ability to parameterize types
  755. and functions with types.  This is useful for parameterized classes and
  756. polymorphic functions in statically typed languages such as Ada, C++, Eiffel,
  757. and etc.  Generics are orthogonal to inheritance, since types (and classes)
  758. may be generically parameterized.  Generics provide for reusability in
  759. programming languages.  An example is a Stack with a generically
  760. parameterized base type.  This allows a single Stack class to provide
  761. many strongly checked instantiations such as a Stack of ints, a Stack
  762. of any fundamental or user defined type, or even a Stack of Stacks of ....
  763.  
  764. While generics have many advantages, limitations include its static nature
  765. (which is an advantage for strong typechecking but a disadvantage for run-time
  766. flexibility which either isn't present or potentially causes dynamic
  767. compilation (leading to a time/space/static efficiency tradeoff)), and sources
  768. are like inlines and create source code dependencies and usually expand code
  769. size (unlike a single-body parametrically polymorphic implementation found in
  770. dynamically-typed languages).  Generics are also a special static case of 
  771. type variables.
  772.  
  773. All functions are generic in statically-typed parametrically-polymorphic
  774. languages.  One such popular language is ML, in which all functions are
  775. implicitly generically instantiated.
  776.  
  777.  
  778. KINDS OF OO:
  779. ============
  780.  
  781.   References
  782.     [Coplien 92]    Covers C++, symbolic, exemplar (single-hierarchy), etc.
  783.     [Kim 89]        Covers many OO systems.
  784.  
  785.  
  786. What Is the "Classical" Object-Oriented Paradigm?
  787.  
  788. This refers to the usual class and object model.  Its any 2+ level system
  789. as described above under Meta-Classes [Coplien 92].
  790.  
  791.  
  792. What Is the "Delegation/Prototyping" Object-Oriented Paradigm?
  793.  
  794. This is the 1 Level System as Described under Meta-Classes.  Delegation
  795. refers to the delegating of responsibility and can be applied to
  796. inheritance.  When a derived class does not have a desired attribute,
  797. it "delegates" responsibility to one of its base classes.  In delegation
  798. systems, each object has a delegate list instead of a parent list. Thus,
  799. delegation's original intention was not for inheritance but was for
  800. message passing systems where an object could delegate responsibility of
  801. a message it couldn't handle to objects who potentially could (its delegates).
  802. Any object can be added to the delegate list, giving dynamic inheritance (of
  803. a sort).  Typically, delegation and prototyping languages also have "part
  804. inheritance" in which fields and methods can be added and deleted from
  805. objects.  This makes for easy "prototyping", which allows for objects to be
  806. constructed piece by piece at run-time.
  807.  
  808.  
  809. Are There any Others Paradigms?
  810.  
  811. There are many alternatives in OO.  Emerald/Jade provides one, where
  812. inheritance is replaced with a roughly equivalent form where reuse occurs at a
  813. finer degree of granularity, the method and instance variables.
  814.  
  815. CLOS has a looser coupling of methods to classes and doesn't distinguish a
  816. receiver, but modules can help make up the difference.
  817.  
  818.  
  819. GENERAL
  820. =======
  821.  
  822. References to be added..
  823.  
  824. What Are the Major Languages in Object-Oriented Programming Today?
  825.  
  826. Statically-Typed:
  827.   C++
  828.   Eiffel
  829.  
  830. Dynamically-Typed:
  831.   Smalltalk
  832.   Self
  833.   Objective-C
  834.  
  835. Both:
  836.   CLOS
  837.  
  838.  
  839. What Are Object-Oriented Databases?
  840.  
  841. Object-Oriented Databases are databases that support objects and classes.
  842. They are different from the more traditional relational databases because
  843. they allow structured subobjects, each object has its own identity, or
  844. object-id (as opposed to a purely value-oriented approach) and because of
  845. support for methods and inheritance.  It is also possible to provide
  846. relational operations on an object-oriented database.  These databases allow
  847. all the benefits of object-orientation, as well as the ability to have a
  848. strong equivalence with object-oriented programs, an equivalence that would be
  849. lost if an alternative were chosen, such as a relational database.
  850.  
  851. Another way of looking at Object-Oriented Databases is as a persistent object
  852. store with a DBMS.
  853.  
  854.  
  855. What Are Object-Oriented Operating Systems?
  856.  
  857. Object-Oriented Operating Systems support objects all the way down to
  858. to the machine.  They are almost always distributed systems, allowing
  859. objects to be passed freely between machines.  They are capability-based
  860. since objects, and hence system resources, can only be accessed if a
  861. capability to them is available to programs.
  862.  
  863.  
  864. What Are the Current Object-Oriented Methodologies?
  865.  
  866. An excellent review of available Methodologies recently appeared in CACM/
  867. September 1992/Vol.35, No.9, pp35, "A Research Typology for Object-Oriented
  868. Analysis and Design".  The Process and Representation Methodologies/Notations
  869. surveyed are:
  870.   Alabiso
  871.   Bailin
  872.   Booch
  873.   Coad/Yourdon
  874.   Gorman and Choobineh
  875.   Iivari
  876.   Kappel
  877.   Lieberherr et al.
  878.   Meyer
  879.   Rumbaugh et al.
  880.   Shlaer and Mellor
  881.   Wirfs-Brock et al.
  882.  
  883.  
  884. What Is the OMG/ORA/...?
  885.  
  886. Contact Person: To be added
  887. FTP Site:    To be added
  888.  
  889. The Object Management Group (OMG) is an international software industry
  890. consortium with two primary aims:
  891.  
  892. (*) promotion of the object-oriented approach to software engineering
  893.     in general, and
  894.  
  895. (*) development of command models and a common interface for the development
  896.     and use of large-scale distributed applications (open distributed
  897.     processing) using object-oriented methodology.
  898.  
  899. In late 1990 the OMG published its Object Management Architecture
  900. (OMA) Guide document. This document outlines a single terminology for
  901. object-oriented languages, systems, databases and application
  902. frameworks; an abstract framework for object-oriented systems; a set
  903. of both technical and architectural goals; and an architecture
  904. (reference model) for distributed applications using object-oriented
  905. techniques.  To fill out this reference model, four areas of
  906. standardization have been identified:
  907.  
  908. 1) the Object Request Broker, or key communications element, for
  909.    handling distribution of messages between application objects in
  910.    a highly interoperable manner;
  911.  
  912. 2) the Object Model, or single design-portability abstract model for
  913.    communicating with OMG-conforming object-oriented systems;
  914.  
  915. 3) the Object Services, which will provide the main functions for
  916.    realising basic object functionality using the Object Request Broker -
  917.    the logical modeling and physical storage of objects; and
  918.  
  919. 4) the Common Facilities will comprise facilities which are useful in
  920. many application domains and which will be made available through OMA
  921. compliant class interfaces.
  922.  
  923.  
  924. Why Is Garbage Collection a Good Thing?
  925.  
  926.   From: Paul Johnson (paj@gec-mrc.co.uk)
  927.  
  928. Garbage collection (GC) is a facility in the run-time system
  929. associated with a language which will automatically reclaim objects
  930. which are no longer used.  OO Languages which require garbage
  931. collection include Eiffel, Smalltalk and CLOS.  C and C++ can have
  932. garbage collection retrofitted (see [3] below).  [Ada has switchable GC,
  933. too -bob]
  934.  
  935. Without GC programmers must explicitly deallocate dynamic storage when
  936. it is no longer needed (in C this is done by a call to free(3)).
  937. There are a number of problems with this:
  938.  
  939. 1: Bugs due to errors in storage deallocation are very hard to find,
  940.    although products are available which can help.
  941.  
  942. 2: In some circumstances the decision about whether to deallocate
  943.    storage cannot be made by the programmer.  Drawing editors and
  944.    interpreters often suffer from this.  The usual result is that the
  945.    programmer has to write an application-specific garbage collector.
  946.  
  947. 3: An object which is responsible for deallocating storage must be
  948.    certain that no other object still needs that storage.  Thus many
  949.    modules must co-operate closely.  This leads to a tight binding
  950.    between supposedly independent modules.
  951.  
  952. 4: Libraries with different deallocation strategies are often
  953.    incompatible, hindering reuse.
  954.  
  955. 5: In order to avoid problems 3 and 4, programmers may end up copying
  956.    and comparing whole objects rather than just references.  This is a
  957.    particular problem with temporary values produced by C++ overloaded
  958.    operators.
  959.  
  960. 6: Because keeping track of storage is extra work, programmers often
  961.    resort to statically allocated arrays.  This in turn leads to
  962.    arbitrary restrictions on input data which can cause failure when
  963.    the assumptions behind the chosen limits no longer apply.  For
  964.    instance many C compilers limit expression nesting, identifier
  965.    length, include file nesting and macro stack depth.  This causes
  966.    problems for programs that generate C.
  967.  
  968. One partial solution to a lack of GC is reference counting.  In this
  969. scheme each object keeps a count of references to it.  When this count
  970. drops to zero the object is automatically deallocated.  However this
  971. is inefficient (swapping two references will result in three
  972. decrements, three increments and six comparisons) and cannot reclaim
  973. circular data structures.  Two systems that use a reference count GC
  974. are the Interviews C++ graphics library and the Unix file system (the
  975. link count).
  976.  
  977. Opponents of GC reply that it introduces an overhead which is
  978. unacceptable in some applications.  However the overhead of manual
  979. storage deallocation is probably as high as GC.  GC algorithms are
  980. also available with good real-time behaviour.
  981.  
  982. Further Reading:
  983.  
  984. [1] "Object-Oriented Software Construction" by Meyer puts the argument
  985. for GC.
  986.  
  987. [2] "Uniprocessor Garbage Collection Techniques" in the proceedings of
  988. the "1992 International Workshop on Memory Management" in the
  989. Springer-Verlag Lecture Notes in Computer Science series.  This is an
  990. excellent summary of the state of the art in GC algorithms.
  991.  
  992. [3] "Garbage Collection in an Uncooperative Environment" by Boehm and
  993. Weiser.  Software --- Practise and Experience vol 18(9), pp 807-820.
  994. Sept 1988.  This describes GC in C and C++.
  995.  
  996.  
  997.  
  998. COMMONLY ASKED LANGUAGE SPECIFIC QUESTIONS
  999. ==========================================
  1000.  
  1001. What is Downcasting?
  1002.  
  1003. Downcasting the term used in C++ for casting a pointer or reference to a
  1004. base class to a derived class.  This should usually be checked with an
  1005. embedded dynamic typing scheme if such a scheme is not present in the
  1006. language, such as with a typecase (Modula-3) or inspect (Simula) construct.
  1007. In C++, it is even possible to use conversion functions to perform some
  1008. checks.
  1009.  
  1010.  
  1011. What are Virtual Functions?
  1012.  
  1013. Look under "Dynamic Binding" and "Polymorphism".
  1014.  
  1015.  
  1016. ANNOTATED BIBLIOGRAPHY
  1017.  
  1018. [Booch 87] Grady Booch.  Software Engineering with Ada.  2nd Ed.  Benjamin
  1019.  Cummings.
  1020. [Booch 87] Grady Booch.  Software Componenets With Ada, Structures, Tools,
  1021.  and Subsystems.  Benjamin Cummings.
  1022.  
  1023.   Booch in his early years.  Mostly object-based programming with Ada.
  1024.  
  1025. [Booch 91] Booch, Grady. Object-Oriented Design With Applications.
  1026.  
  1027.   The often referred to book on OOD.  Offers design notation and methodology.
  1028.   Brief coverage of OOA and elaborate OOD/P coverage in the applications.
  1029.   Good on basic principles and has case studies in Smalltalk, Object Pascal, 
  1030.   C++, CLOS and Ada.
  1031.  
  1032.   Also contains an *elaborate* classified bibliography on many areas of OO.
  1033.  
  1034. [Cardelli 85]  L. Cardelli and P. Wegner.  On Understanding Types, Data
  1035.  Abstraction, and Polymorphism.  ACM Computing Surveys vol. 17 (4).
  1036.  
  1037.  Long article on Object-Oriented Types, Data Abstraction and Polymorphism.
  1038.  Formal coverage with a type system analysis model as well.
  1039.  
  1040. [Coplien 92] James O. Coplien.  Advanced C++ Programming Styles and Idioms.
  1041.   Addison Wesley.
  1042.  
  1043.   Covers advanced C++ programming.
  1044.  
  1045. [Cox 87] Cox, Brad J.  Object-Oriented Programming, An Evolutionary Approach.
  1046.  Addison Wesley.
  1047.  
  1048.   The original book on Objective-C.  Coverage on object-oriented design and
  1049.   programming.  Also covers Objective-C implementation, even into object code.
  1050.  
  1051. Emerald/Jade    [Entry To Be Completed]
  1052.  
  1053.   The original articles on Emerald and Jade.  OO languages without
  1054.   inheritance but with abstract types and static polymorphism.  Also
  1055.   designed for distributed programming and reuse. 
  1056.  
  1057. [Goldberg 83], Adele Goldger and David Robson. Smalltalk-80 The Language and
  1058.  Its Implementation.  Addison Wesley.
  1059.  
  1060.   The original book on Smalltalk.  Covers implementation.
  1061.  
  1062. [Kim 89]  Won Kim and Frederick Lochovsky Editors.  Object-Oriented Concepts,
  1063.  Applications, and Databases.
  1064.  
  1065.   Collection of articles on advanced OO and research systems.
  1066.  
  1067. [Meyer 88] Meyer, Bertrand. Object-Oriented Software Construction.  Prentice
  1068.  Hall.  [Is there a new edition out?]
  1069.  
  1070.   The original book on Eiffel.  Coverage on object-oriented design and
  1071.   programming.
  1072.  
  1073.  
  1074. [Rumbaugh 91] Rumbaugh James, et al.  Object-Oriented Modeling and Design.
  1075. Prentice Hall.
  1076.  
  1077.   The often referred to book on OOA/OOD.  Introduces the "Object Modeling
  1078.   Technique (OMT) OOA/D notation and methodology.  Has case studies.
  1079.  
  1080. [Stroustrup 91] Ellis, M.A., Stroustrup. The Annotated C++ Reference Manual.
  1081.  Addison Wesley.
  1082.  
  1083.   The ARM; the original and definitive book on C++.  Serves as the ANSI
  1084.   base document for C++.  Also covers C++ implementation.
  1085.  
  1086. [Ungar 87] D. Ungar and R.B. Smith.  The Self Papers. [Entry To Be Completed]
  1087.  
  1088.   The documents on Self; a delegation/prototyping language.  Also covers
  1089.   Self implementation and optimization.
  1090.  
  1091.  
  1092.  
  1093.  
  1094.