RPGCode — Object Oriented Coding — Polymorphism
Something you often need do in programming is express a relationship between types. Whether it be different types of numbers, jobs in an office, one class should be somehow expressed as a type of another. In object oriented programming we often express this relationship using inheritance. In inheritance, the inheriting class - or derived class - obtains all the functions and variables of the class being inherit, the base class.
In RPGCode, classes can have an unlimited number of bases and they are set like this:
class CDerived [: CBaseOne, CBaseTwo, ...]
Take this number class, for example:
// A number
class CNumber
{
// Public visibility
public:
// Constructor
method CNumber(num!)
// Cast to numerical
method operator!() { returnMethod(m_val!) }
// Alter the number
method operator=(newVal!)
// Private visibility
private:
m_val! // Value of the number
}
// CNumber - constructor
method CNumber::CNumber(num!)
{
// Copy value to a member
m_val! = num!
}
// CNumber - assignment operator
method CNumber::operator=(newVal!)
{
m_val! = newVal!
}
The CNumber class provides basic functionality for a number. It does not, however, have functions specific to the type of number being manipulated. If you want to manipulate a fraction, for example, you might code a class like this:
// A fraction
class CFraction: CNumber
{
// Public visibility
public:
// Constructor
method CFraction(top!, bottom!)
// Get the top
method getTop() { returnMethod(m_top!) }
// Get the bottom
method getBottom() { returnMethod(m_bottom!) }
// Override the = operator
method operator=(CFraction newVal)
// Private visibility
private:
m_top! // Top of the fraction
m_bottom! // Bottom of the fraction
}
// CFraction - constructor
method CFraction::CFraction(top!, bottom!)
{
// Copy params to members
m_top! = top!
m_bottom! = bottom!
m_val! = m_top! / m_bottom!
}
// CFraction - assignment operator
method CFraction::operator=(CFraction newVal)
{
m_top! = newVal->m_top!
m_bottom! = newVal->m_bottom!
// Also set the base class' value member
m_val! = m_top! / m_bottom!
}
Note how the derived class can override the base class' methods. In some situations, you would expect that a method be overloaded every single time. Such relationships can be expressed using a pure virtual function. One can be defined like so:
method pureVirtual(...) = 0
No implementation for the method should be provided, and as such, a class containing even one pure virtual method cannot be created directly - only used a parameter, or inherited.
As shown, polymorphism makes it easy to express relationships between classes.