Differences between revisions 1 and 2
Revision 1 as of 2007-09-25 13:56:01
Size: 1890
Editor: T4d80
Comment: Added section: Make sure (public) inheritance models "is a"
Revision 2 as of 2007-09-25 13:56:59
Size: 1889
Editor: T4d80
Comment: Typo
Deletions are marked like this. Additions are marked like this.
Line 20: Line 20:
In the same sense, an oystrich (which cannot fly) is not a bird (if each bird has a method {{{fly()}}} that augments the bird's height over the ground): In the same sense, an ostrich (which cannot fly) is not a bird (if each bird has a method {{{fly()}}} that augments the bird's height over the ground):

OO and C++ Design Conventions

This page covers design conventions that you should adhere to. Some of them have proven useful for OO design in general, others are special to C++ applications.

Inheritance and object oriented design

Make sure (public) inheritance models "is a"

Whenever you derive a class D from a class B, every object of type D is a B in the sense that the derived class objects must be substitutable for the base class objects.

Do not do it as I (Joachim) have seen it in a real-world project: A person has properties, so CPerson inherits form CPersonProperties, which is a specialization of CProperties. This means, each CPerson is a CProperty, that is, each person is a property, which is non-sense at best, a catastrophic design flaw at worst.

Substitutability means means that objects of the derived class must behave in a manner consistent with the promises made in the base class' contract. Class D (and its methods) must require no more and promise no less than class B (and its overridden methods):

http://www.parashift.com/c++-faq-lite/proper-inheritance.html

In general, forget about "generalization" and "specialization". Think in terms of substitutability: In OO, a circle (which has one member for its radius) is not a specialization of an ellipse (which has two), though in mathematics it is one. The question is whether a circle can be put in wherever an ellipse can. (Most probably not, because it requires more: Even if a circle is considered to be an ellipse, it additionally requires that its two radii are the same.)

In the same sense, an ostrich (which cannot fly) is not a bird (if each bird has a method fly() that augments the bird's height over the ground):

http://www.parashift.com/c++-faq-lite/proper-inheritance.html#faq-21.6

CompleteSearch: completesearch/DesignConventions (last edited 2009-05-28 11:52:26 by infao1900)