# classes.spr — class definitions, fields, methods, inheritance, super
class Shape {
attr color = "red"
def describe {
"A #{self.color} shape"
}
def area {
0
}
}
class Rectangle < Shape {
attr width: Int
attr height: Int
def area {
self.width * self.height
}
def describe {
super + " (rectangle #{self.width}x#{self.height})"
}
}
class Circle < Shape {
attr radius: Int
def area {
# integer approximation
3 * self.radius * self.radius
}
def describe {
super + " (circle r=#{self.radius})"
}
}
r = Rectangle.new(width: 4, height: 5)
print r.describe
print "Area: #{r.area}"
c = Circle.new(color: "blue", radius: 3)
print c.describe
print "Area: #{c.area}"
# Field mutation via methods
class Counter {
attr n = 0
def inc {
self.n = self.n + 1
}
def reset {
self.n = 0
}
def value {
self.n
}
}
counter = Counter.new
counter.inc
counter.inc
counter.inc
print "Counter: #{counter.value}"
counter.reset
print "After reset: #{counter.value}"
# is_a? type checking
print r.is_a?(Rectangle)
print r.is_a?(Shape)
print r.is_a?(Circle)