[Rd] S4 generic functions don't respect S3 class hierarchies.

Mikael Jagan j@g@nmn2 @end|ng |rom gm@||@com
Fri Dec 12 14:49:20 CET 2025


S4 is "formal", so you need to declare inheritance:

     setOldClass(c("SubClass", "SuperClass"))

This usage (first argument of length greater than one) is documented by
help("setOldClass") including among the examples where analogously I see

     setOldClass(c("mlm", "lm"))

and there are more examples in the list of old classes defined by 'methods',
exported as '.OldClassesList'.

Mikael


> Date: Thu, 11 Dec 2025 17:10:28 -0500
> From: Russell Almond<russell.g.almond using gmail.com>
> 
> I noticed this problem while working with R6 objects, but I can
> reproduce it using S3 classes.
> 
> If I define a method on the S3 superclass, the subclass doesn't inherit it.
> 
> ``` r
> library(methods)
> 
> SuperClass <- function(n) {
>     result <- list(n=n)
>     class(result) <- "SuperClass"
>     result
> }
> 
> setOldClass("SuperClass")
> 
> setGeneric("sampleSize",function(x) {standardGeneric("sampleSize")})
> #> [1] "sampleSize"
> 
> setMethod("sampleSize","SuperClass", function(x) {x$n})
> 
> SubClass <- function (n) {
>     result <- SuperClass(n)
>     class(result) <- c("SubClass",class(result))
>     result
> }
> 
> setOldClass("SubClass")
> 
> example <- SubClass(7)
> class(example)
> #> [1] "SubClass"   "SuperClass"
> is(example,"SuperClass")
> #> [1] TRUE
> methods("sampleSize")
> #> [1] sampleSize,SuperClass-method
> #> see '?methods' for accessing help and source code
> sampleSize(example)
> #> Error: unable to find an inherited method for function 'sampleSize'
> for signature 'x = "SubClass"'
> ```
> 
> <sup>Created on 2025-12-11 with [reprex
> v2.1.1](https://reprex.tidyverse.org)</sup>
> 
> I'm using R 4.5.2 and the same version of methods.
> 
> Is this a bug?
> 
>       --Russell
> 
> 
> -- Russell Almond https://ralmond.net/ [[alternative HTML version deleted]]



More information about the R-devel mailing list