Ruby classes and inheritance


 
class Person
  def initialize(name, date_birth)
    @name = name
    @date_birth = date_birth
  end
  
  def to_s
    "Person #{@name} born on #{@date_birth}"
  end
  
# standard methods that create "getters" for instance variables
  attr_reader :name, :date_birth
end

carol = Person.new("Carol Smith","1970-3-15")
puts carol

puts carol.class
puts carol.class.superclass

puts carol.instance_of?(Person)
puts carol.instance_of?(Object)

dave = Person.new("David Brown", "1976-11-23")
puts dave

# can do it because of the attribute reader
puts carol.name

puts carol.object_id
puts dave.object_id

#puts carol.methods.sort # all methods, including those inherited from Object

# adding a method to check if this person is older than another
# person
class Person
  def older another
    return @date_birth < another.date_birth
  end
end

puts carol.older(dave)
puts dave.older(carol)

# definiing "setters" for methods
class Person
  attr_writer :name
  # or you can define it like this: 
  #def name=(newname)
  #  @name = newname
  #end
end

carol.name = "Carole Smith"
puts carol

# no more changes to an object
carol.freeze
# cannot modify an object:
#carol.name = "Hillary Clinton"

dave.name = "Cool Dave"
puts dave
dave.name = "David Brown"

# an error: no such method
#carol.do_something

# make a class react to a call to an unknown method
class Person 
  def method_missing(m)
    puts "no method #{m} here"
  end
end
carol.do_something

###### Inheritance ####################

class Student < Person
  # initializer is optional, by default the one in superclass
  # is called  
  def initialize(name, date_birth, gpa)
    super(name, date_birth)
    @gpa = gpa
  end
  attr_reader :gpa
  # overriding to_s
  def to_s
    super + " has gpa of #{@gpa}"
  end
end

sam = Student.new("Sam Student", "1989-5-20", 3.45)
puts sam

puts sam.older(carol)
puts carol.older(sam)

CSci 4651 course.