Instances of classes, which are sub classes of this class, may be identified at run-time. More…
#include <identity.hh>
Classes |
|
class | Class |
Public Member Functions |
|
IdentifiableObject () | |
void | intoStringBuffer (misc::StringBuffer *sb) |
Store a textual representation of the object in a misc::StringBuffer. More… | |
int | getClassId () |
Returns the class identifier. More… | |
const char * | getClassName () |
Return the name, under which the class of this object was registered. More… | |
bool | instanceOf (int otherClassId) |
Returns, whether this class is an instance of the class, given by otherClassId, or of a sub class of this class. More… | |
![]() |
|
virtual | ~Object () |
The destructor is defined as virtual (but not abstract), so that destruction of Object‘s works properly. More… | |
virtual bool | equals (Object *other) |
Returns, whether two objects are equal. More… | |
virtual int | hashValue () |
Return a hash value for the object. More… | |
virtual Object * | clone () |
Return an exact copy of the object. More… | |
const char * | toString () |
Use object::Object::intoStringBuffer to return a textual representation of the object. More… | |
virtual size_t | sizeOf () |
Return the number of bytes, this object totally uses. More… | |
Protected Member Functions |
|
void | registerName (const char *className, int *classId) |
This method must be called in the constructor for the sub class. See class comment for details. More… | |
Private Attributes |
|
int | classId |
Static Private Attributes |
|
static container::typed::HashTable< object::ConstString, Class > * | classesByName |
static container::typed::Vector< Class > * | classesById |
static Class * | currentlyConstructedClass |
Detailed Description
Instances of classes, which are sub classes of this class, may be identified at run-time.
Testing the class
Since e.g. dw::Textblock is a sub class of IdentifiableObject, and implemented in the correct way (as described below), for any given IdentifiableObject the following test can be done:
isATextblock is true, when o is an instance of dw::Textblock, or of a sub class of dw::Textblock. Otherwise, isATextblock is false.
It is also possible to get the class identifier of an identity::IdentifiableObject, e.g.
would result in true, if o is an instance of dw::Textblock, but not an instance of a sub class of dw::Textblock.
Defining Sub Classes
Each direct or indirect sub class of IdentifiableObject must
- add a static int CLASS_ID with -1 as initial value, and
- call registerName (name, &CLASS_ID) in the constructor, where name should be unique, e.g. the fully qualified class name.
After this, class::CLASS_ID refers to a number, which denotes the class. (If this is still -1, since the class has not yet been instantiated, any test will fail, which is correct.)
Notes on implementation
If there are some classes like this:

and first, an instance of A, and then an instance of C is created, there will be the following calls of functions and constructors:
- IdentifiableObject ();
- registerName (“A”, &A::CLASS_ID);
- IdentifiableObject ();
- registerName (“B”, &B::CLASS_ID);
- registerName (“C”, &C::CLASS_ID);
From this, the class hierarchy above can easily constructed, and stored in identity::IdentifiableObject::classesByName and in identity::IdentifiableObject::classesById. See the code for details.
N.b. Multiple inheritance is not supported, the construction of the tree would become confused.
Constructor & Destructor Documentation
lout::identity::IdentifiableObject::IdentifiableObject | ( | ) |
Member Function Documentation
|
inline |
Returns the class identifier.
This is rarely used, rather, tests with identity::IdentifiableObject::instanceOf are done.
References classId.
|
inline |
Return the name, under which the class of this object was registered.
References lout::identity::IdentifiableObject::Class::className, and lout::container::typed::Vector< T >::get().
Referenced by dw::Textblock::addWidget(), dw::core::Iterator::intoStringBuffer(), and dw::core::Content::intoStringBuffer().
bool lout::identity::IdentifiableObject::instanceOf | ( | int | otherClassId | ) |
Returns, whether this class is an instance of the class, given by otherClassId, or of a sub class of this class.
References lout::identity::IdentifiableObject::Class::parent.
Referenced by dw::Textblock::addWidget(), and dw::Table::getCellRef().
|
virtual |
Store a textual representation of the object in a misc::StringBuffer.
This is used by object::Object::toString.
Reimplemented from lout::object::Object.
References lout::misc::StringBuffer::append(), and lout::misc::StringBuffer::appendPointer().
|
protected |
This method must be called in the constructor for the sub class. See class comment for details.
References lout::identity::IdentifiableObject::Class::id.
Referenced by dw::AlignedTableCell::AlignedTableCell(), dw::AlignedTextblock::AlignedTextblock(), dw::ListItem::ListItem(), dw::RegardingBorder::RegardingBorder(), dw::Ruler::Ruler(), and dw::SimpleTableCell::SimpleTableCell().
Member Data Documentation
|
staticprivate |
|
staticprivate |
|
private |
Referenced by getClassId().
|
staticprivate |
The documentation for this class was generated from the following files:
- lout/identity.hh
- lout/identity.cc
Generated on Mon Apr 6 2015 02:15:19 for Dillo by
