The prototype declaration of a class is as follows:
_________________________________________________________________________________________________________
Class types
___________________________________________________________________
Remark: In MacPas mode, the Object keyword is replaced by the class keyword for compatibility with other pascal compilers available on the Mac. That means that in MacPas mode, the reserved word ’class’ in the above diagram may be replaced by the reserved word ’object’.
In a class declaration, as many private, protected, published and public blocks as needed can be used: the various blocks can be repeated, and there is no special order in which they must appear.
Methods are normal function or procedure declarations. As can be seen, the declaration of a class is almost identical to the declaration of an object. The real difference between objects and classes is in the way they are created (see further in this chapter). The visibility of the different sections is as follows:
In the syntax diagram, it can be seen that a class can list implemented interfaces. This feature will be discussed in the next chapter.
Classes can contain Class methods: these are functions that do not require an instance. The Self identifier is valid in such methods, but refers to the class pointer (the VMT).
Similar to objects, if the {$STATIC ON} directive is active, then a class can contain static fields: these fields are global to the class, and act like global variables, but are known only as part of the class. They can be referenced from within the classes’ methods, but can also be referenced from outside the class by providing the fully qualified name.
For instance, the output of the following program:
will be the following
Note that the last line of code references the class type itself (cl), and not an instance of the class (cl1 or cl2).
It is also possible to define class reference types:
_________________________________________________________________________________________________________
Class reference type
___________________________________________________________________
Class reference types are used to create instances of a certain class, which is not yet known at compile time, but which is specified at run time. Essentially, a variable of a class reference type contains a pointer to the definition of the speficied class. This can be used to construct an instance of the class corresponding to the definition, or to check inheritance. The following example shows how it works:
This function can be passed a class reference of any class that descends from TComponent. The following is a valid call:
On return of the CreateComponent function, C will contain an instance of the class TEdit. Note that the following call will fail to compile:
because TStream does not descend from TComponent, and AClass refers to a TComponent class. The compiler can (and will) check this at compile time, and will produce an error.
References to classes can also be used to check inheritance:
The above example will raise an exception if the passed instance is not a descendent of TMinClass or a descendent if TMaxClass.
More about instantiating a class can be found in the next section.