Hi. On Fri, Aug 26, 2011 at 8:58 AM, Ben qant <ccqu...@gmail.com> wrote: > If someone is able, can you tell me if there is a better way to do this? > More specifically, do I have to rewrite all of the data members stuff and > extend stuff of parent class in the child class?
No. > See below. Thanks in > advance! > > Example 1: > > setConstructorS3("ClassA", function(A,x) { > if(missing(A))A=15; > if(missing(x))x=NA; > extend(Object(), "ClassA", > .size = A, > .x=x > ) > }) > setMethodS3("getSize", "ClassA", function(this,...) { > this$.size; > }) > setMethodS3("getX", "ClassA", function(this,...) { > this$.x; > }) > > setConstructorS3("ClassB", function(A,x,bData) { > if(missing(bData))bData = NA; > extend(ClassA(), "ClassB", > .bData = bData > ) > }) The key is to understand that that inner ClassA() is a just regular function call that returns an object of class "ClassA" [with full class attribute vector c("ClassA", "Object")]. Since it is a regular function you can pass arguments to it as well, so in your case just do: setConstructorS3("ClassB", function(A,x,bData) { if(missing(A))A=15; if(missing(x))x=NA; if(missing(bData))bData = NA; extend(ClassA(A=A, x=x), "ClassB", .bData = bData ) }) or more generic: setConstructorS3("ClassB", function(..., bData) { if(missing(bData)) bData = NA; extend(ClassA(...), "ClassB", .bData = bData ) }) Personally, I also try to avoid using missing() and instead using default argument values, i.e. setConstructorS3("ClassA", function(A=15, x=NA) { extend(Object(), "ClassA", .size = A, .x=x ) }) setConstructorS3("ClassB", function(..., bData=NA) { extend(ClassA(...), "ClassB", .bData = bData ) }) which also makes things cleaner. Hope this helps /Henrik (author of R.oo) > setMethodS3("getBData", "ClassB", function(this,...) { > this$.bData; > }) > > Usage: >> b = ClassB(13,100,6) >> b$getSize() # I expected to get 13. > [1] 15 >> b$getBData() > [1] 6 >> b$getX() > [1] NA # Same thing here. I expected 100. > > > I corrected it by rewriting the ClassA data member defaults and the ClassA > extend() stuff within the ClassB class. > > Example 2: > > setConstructorS3("ClassA", function(A,x) { > if(missing(A))A=15; > if(missing(x))x=NA; > extend(Object(), "ClassA", > .size = A, > .x=x > ) > }) > setMethodS3("getSize", "ClassA", function(this,...) { > this$.size; > }) > setMethodS3("getX", "ClassA", function(this,...) { > this$.x; > }) > > setConstructorS3("ClassB", function(A,x,bData) { > if(missing(bData))bData = NA; > if(missing(A))A=15; #added > if(missing(x))x=NA; #added > extend(ClassA(), "ClassB", > .bData = bData, > .x=x, #added > .size=A #added > ) > }) > setMethodS3("getBData", "ClassB", function(this,...) { > this$.bData; > }) > >> b = ClassB(13,100,6) >> b$getSize() > [1] 13 >> b$getBData() > [1] 6 >> b$getX() > [1] 100 > > Thanks for your help! > > Ben > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.