From hpages at fhcrc.org  Thu Sep 27 02:34:33 2007
From: hpages at fhcrc.org (Herve Pages)
Date: Wed, 26 Sep 2007 17:34:33 -0700
Subject: [Rd] Virtual class with no slots
Message-ID: <46FAFA99.7040201@fhcrc.org>

Hi,

It seems there are 2 slightly different ways to create a virtual
class with no slots (a kind of Java "interface"): with or without
specifying 'representation("VIRTUAL")'.

  > setClass("A", representation("VIRTUAL"))
  [1] "A"

  > showClass("A")
  Virtual Class

  No Slots, prototype of class "S4"

  > setClass("B")
  [1] "B"

  > showClass("B")
  Virtual Class

  No Slots, prototype of class "NULL"

Note that:

  - R automatically decided to make B virtual, a strange design decision
    (IMO) that could have been motivated (I'm trying to guess here) by the
    fact that it is probably not very useful to create objects with no slots.
    But I would argue that it could also be left to the user to decide whether
    or not it is a good idea to create such objects (maybe s/he has a use case).

  - Surprisingly, A and B descriptions are slightly different: A's prototype
    is of class "S4" and B's prototype is of class "NULL".

So my question is (just curiosity): why do we have 2 different forms
(leading to different results) to create a virtual class with no slots.
And which one is better?

Also note that, if I try to extend "A" without adding any new slot:

  > setClass("AA", contains="A")
  [1] "AA"

  > showClass("AA")

  No Slots, prototype of class "S4"

  Extends: "A"

now it seems that, yes, it is possible to create a non-virtual class with
no slots! ( it's not easy though :-b ) So I'm wondering why this was not
possible with 'setClass("B")' or 'setClass("B", representation())' in the
first place.

Finally, if I try to instance "AA":

  > new("AA")
  An object of class "AA"
  Error in getClass(class(object)) : "S4" is not a defined class

Oops! Seems that non-virtual classes with no slots are broken anyway :-/

Cheers,
H.


> sessionInfo()
R version 2.6.0 beta (2007-09-19 r42914)
x86_64-unknown-linux-gnu

locale:
LC_CTYPE=en_US;LC_NUMERIC=C;LC_TIME=en_US;LC_COLLATE=en_US;LC_MONETARY=en_US;LC_MESSAGES=en_US;LC_PAPER=en_US;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US;LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] rcompgen_0.1-15



[Rd] Virtual class with no slots
Herve Pages