\HeaderA{Classes}{Class Definitions}{Classes}
\aliasA{\_\_ClassMetaData}{Classes}{.Rul..Rul.ClassMetaData}
\keyword{programming}{Classes}
\keyword{classes}{Classes}
\keyword{methods}{Classes}
\begin{Description}\relax
Class definitions are objects that contain the formal definition of a
class of R objects.
\end{Description}
\begin{Details}\relax
When a class is defined, an object is stored that contains the
information about that class, including:

\describe{
\item[slots] Each slot is a component object.  Like elements of a
list these may be extracted (by name) and set.  However, they
differ from list components in important ways.

All the objects from a particular class have the same set of slot
names; specifically, the slot names that are contained in the
class definition.  Each slot in each object always has the same
class; again, this is defined by the overall class definition.

Classes don't need to have any slots, and many useful classes do
not.  These objects usually extend other, simple objects, such as
numeric or character vectors.  Finally, classes can have no data
at all---these are known as \emph{virtual} classes and are in fact
very important programming tools.  They are used to group together
ordinary classes that want to share some programming behavior,
without necessarily restricting how the behavior is implemented.

\item[extends] The names of the classes that this class extends.  A
class \code{Fancy}, say, extends a class \code{Simple} if an
object from the \code{Fancy} class has all the capabilities of
the \code{Simple} class (and probably some more as well).  In
particular, and very usefully, any method defined to work for a
\code{Simple} object can be applied to a \code{Fancy} object as
well.

In other programming languages, this relationship is sometimes
expressed by saying that \code{Simple} is a superclass of
\code{Fancy}, or that \code{Fancy} is a subclass of
\code{Simple}.

The actual class definition object contains the names of all the
classes this class extends.  But those classes can themselves
extend other classes also, so the complete extension can only be
known by obtaining all those class definitions.

Class extension is usually defined when the class itself is
defined, by including the names of superclasses as unnamed
elements in the representation argument to \code{\LinkA{setClass}{setClass}}.

An object from a given class will then have all the slots
defined for its own class \emph{and} all the slots defined for
its superclasses as well.

Note that \code{extends} relations can be defined in other ways
as well, by using the \code{\LinkA{setIs}{setIs}} function.

\item[prototype] Each class definition contains a prototype object
from the class.  This must have all the slots, if any, defined by
the class definition.

The prototype most commonly just consists of the prototypes of all
its slots.  But that need not be the case:  the definition of the
class can specify any valid object for any of the slots.

There are a number of \dQuote{basic} classes, corresponding to the
ordinary kinds of data occurring in R.  For example,
\code{"numeric"} is a class corresponding to numeric vectors.
These classes are predefined and can then be used as slots or as
superclasses for any other class definitions.  The prototypes for
the vector classes are vectors of length 0 of the corresponding
type.

There are also a few basic virtual classes, the most important
being \code{"vector"}, grouping together all the vector classes;
and \code{"language"}, grouping together all the types of objects
making up the R language.

}
\end{Details}
\begin{Author}\relax
John Chambers
\end{Author}
\begin{References}\relax
The web page \url{http://www.omegahat.org/RSMethods/index.html} is the
primary documentation.

The functions in this package emulate the facility for classes and
methods described in \emph{Programming with Data} (John M. Chambers,
Springer, 1998).  See this book for further details and examples.
\end{References}
\begin{SeeAlso}\relax
\code{\LinkA{Methods}{Methods}},
\code{\LinkA{setClass}{setClass}},
\code{\LinkA{is}{is}},
\code{\LinkA{as}{as}},
\code{\LinkA{new}{new}},
\code{\LinkA{slot}{slot}}
\end{SeeAlso}

