A not completely uncommon pattern is to use small classes to provide multiple dispatch
setClass("Base")
A = setClass("A", contains="Base")
B = setClass("B", contains="Base")
My = setClass("My", representation(slot1="Base"))
setGeneric("do", function(x, y, ...) standardGeneric("do"))
setMethod("do", "My", function(x, y, ...) do(x, x@slot1, ...))
and then methods to handle the re-dispatch
setMethod("do", c("My", "A"), function(x, y, ...) "My-A")
setMethod("do", c("My", "B"), function(x, y, ...) "My-B")
In action:
> My = setClass("My", representation(slot1="Base"))
> a = My(slot1=A())
> b = My(slot1=B())
> do(a)
[1] "My-A"
> do(b)
[1] "My-B"