Contributed by Chris Rathman
setClass("shape",
representation(x="numeric", y="numeric"),
prototype(x=0, y=0)
)
# accessors for x & y
setGeneric("getX", function(this) standardGeneric("getX"))
setMethod("getX", "shape",
function(this) {
this@x
}
)
setGeneric("getY", function(this) standardGeneric("getY"))
setMethod("getY", "shape",
function(this) {
this@y
}
)
setGeneric("setX<-", function(this, value) standardGeneric("setX<-"))
setReplaceMethod("setX", "shape",
function(this, value) {
this@x <- value
this
}
)
setGeneric("setY<-", function(this, value) standardGeneric("setY<-"))
setReplaceMethod("setY", "shape",
function(this, value) {
this@y <- value
this
}
)
# move the x & y position of the object
setGeneric("moveTo<-", function(this, value) standardGeneric("moveTo<-"))
setReplaceMethod("moveTo", "shape",
function(this, value) {
setX(this) <- value[1]
setY(this) <- value[2]
this
}
)
setGeneric("rMoveTo<-", function(this, value) standardGeneric("rMoveTo<-"))
setReplaceMethod("rMoveTo", "shape",
function(this, value) {
moveTo(this) <- value + c(getX(this), getY(this))
this
}
)
# virtual draw method
setGeneric("draw", function(this) standardGeneric("draw"))
|
setClass("rectangle",
representation(width="numeric", height="numeric"),
prototype(width=0, height=0),
contains=("shape")
)
# accessors for the width & height
setGeneric("getWidth", function(this) standardGeneric("getWidth"))
setMethod("getWidth", "rectangle",
function(this) {
this@width
}
)
setGeneric("getHeight", function(this) standardGeneric("getHeight"))
setMethod("getHeight", "rectangle",
function(this) {
this@height
}
)
setGeneric("setWidth<-", function(this, value) standardGeneric("setWidth<-"))
setReplaceMethod("setWidth", "rectangle",
function(this, value) {
this@width <- value
this
}
)
setGeneric("setHeight<-", function(this, value) standardGeneric("setHeight<-"))
setReplaceMethod("setHeight", "rectangle",
function(this, value) {
this@height <- value
this
}
)
# draw the rectangle
setMethod("draw", "rectangle",
function(this) {
print(sprintf("Drawing a Rectangle at:(%g,%g), width %g, height %g",
getX(this), getY(this), getWidth(this), getHeight(this)))
}
)
|
setClass("circle",
representation(radius="numeric"),
prototype(radius=0),
contains=("shape")
)
# accessors for the radius
setGeneric("getRadius", function(this) standardGeneric("getRadius"))
setMethod("getRadius", "circle",
function(this) {
this@radius
}
)
setGeneric("setRadius<-", function(this, value) standardGeneric("setRadius<-"))
setReplaceMethod("setRadius", "circle",
function(this, value) {
this@radius <- value
this
}
)
# draw the circle
setMethod("draw", "circle",
function(this) {
print(sprintf("Drawing a Circle at:(%g,%g), radius %g",
getX(this), getY(this), getRadius(this)))
}
)
|
tryMe <- function() {
# set up some shape instances
scribble <- list(new("rectangle", x=10, y=20, width=5, height=6),
new("circle", x=15, y=25, radius=8))
# iterate through the array and handle shapes polymorphically
for (each in scribble) {
draw(each)
rMoveTo(each) <- c(100, 100)
draw(each)
}
# access a rectangle specific function
arect <- new("rectangle", x=0, y=0, width=15, height=15)
setWidth(arect) <- 30
draw(arect)
}
tryMe()
|
source("shape.r")
source("rectangle.r")
source("circle.r")
source("polymorph.r")
|
[1] "Drawing a Rectangle at:(10,20), width 5, height 6" [1] "Drawing a Rectangle at:(110,120), width 5, height 6" [1] "Drawing a Circle at:(15,25), radius 8" [1] "Drawing a Circle at:(115,125), radius 8" [1] "Drawing a Rectangle at:(0,0), width 30, height 15" |