From jmc at r-project.org  Mon Jul 28 22:13:07 2008
From: jmc at r-project.org (John Chambers)
Date: Mon, 28 Jul 2008 16:13:07 -0400
Subject: [Rd] S4 classes that extend S3 classes
Message-ID: <488E2853.6090105@r-project.org>

Up to now,  writing an S4 class that extends an S3 class (using 
contains= in the call to setClass) has been discouraged for two main 
reasons:

1.  You can't say anything formal about S3 classes, so validating 
objects, having formal slots for their properties, etc. are not 
generally feasible.

2.  In any case, the S3 class, which may have multiple strings in the 
class attribute, was not available in objects from the S4 class; so, 
among other problems, S3 method dispatch would not work for such a class.

The first problem is fairly intrinsic and remains a reason to hesitate.  
But a recent change to the 2.8.0 development version takes some steps to 
reduce the second problem.

The mechanism is to include the S3 class of objects as a special slot in 
any class that extends "oldClass"; therefore, any S3 class registered by 
calling setOldClass(), and any S4 class that extends such a class, will 
have the underlying S3 class available.  S3 method dispatch and the 
inherits() function make use of this information in the latest version 
(revision r46128 of July 27, with a bug fix r46136 July 28).

So if you can live with the limitations of the first point and would 
like to experiment with extending an S3 class, you're invited to try.  
Note that the S3 classes _must_ be registered via setOldClass() for 
extensions to work.

See ?Classes, ?setOldClass and ?S3Class for details.

John



[Rd] S4 classes that extend S3 classes
John Chambers