Post #6: Object Oriented Programming: Methods
Instance vs. Class Methods
June 26, 2015
Upon being assigned a few OOP topics to choose from, I selected to research and write about instance vs. class methods. My understanding of classes as a concept in general is something I want to better solidify. I learn best through doing research, seeing examples, and then applying the concepts in creative practice. In a recent session with a guide, she demonstrated creating a class method using self
within the class. This did not click for me initially, so I spent some time researching self and exploring how this relates to instance vs. class methods.
Class methods are those that can be called on the original created class. Instance methods; however, can only be called on new instances of that created class. I found basic examples like the one below to be helpful in the introduction of this idea.
class Name def initialize(name) @name = name end def introduce puts "My name is #{@name}." end end
Within the class Name
, an instance method introduce
was created. We can call the method introduce
on any instance of the class Name
. I cannot; however, call the method introduce
on the class itself.
dan = Name.new("Dan") dan.introduce # My name is Dan.
However if we try to call the following, we will get an error.
Name.introduce #undefined method 'introduce' for Name:Class
We can define a class method as well.
class Name def self.class_method puts "I am calling a class method now." end def initialize(name) @name = name end def introduce puts "My name is #{@name}." end end
We can then call the class method.
Name.class_method # I am calling a class method now. dan.class_method # undefined method 'class_method' for (instance of Name class)
Below is a class I created to experiment with my understanding of instance verses class variables that imitated my recent assignment.
ROSTER = {:Audrey=> {position: "setter", jersey: 1}, :Juana => {position: "libero", jersey: 21}, :Rut => {position: "defense", jersey: 3}} class VolleyballPlayer def self.introduce_team puts "This is a class method" ROSTER.each do |player, info| puts "Number #{ROSTER[player][:jersey]} is #{player} playing #{ROSTER[player][:position]}" end end def initialize(player, position, jersey) @player = player @position = position @jersey = jersey end def introduce_player puts "This is an instance of the class VolleyballPlayer" puts "Number #{@jersey.to_s} is #{@player} playing #{@position.to_s}." end end audrey = VolleyballPlayer.new("Audrey", ROSTER[:Audrey][:position], ROSTER[:Audrey][:jersey]) audrey.introduce_player rut = VolleyballPlayer.new("Rut", ROSTER[:Rut][:position], ROSTER[:Rut][:jersey]) rut.introduce_player juana = VolleyballPlayer.new("Juana", ROSTER[:Juana][:position], ROSTER[:Juana][:jersey]) juana.introduce_player VolleyballPlayer.introduce_team
This would result in the following pritning to the console:
This is an instance of the class VolleyballPlayer Number 1 is Audrey playing setter. This is an instance of the class VolleyballPlayer Number 3 is Rut playing defense. This is an instance of the class VolleyballPlayer Number 21 is Juana playing libero. This is a class method Number 1 is Audrey playing setter Number 21 is Juana playing libero Number 3 is Rut playing defense
Instance methods are the best option for creating single instances of a class. Like one version of a player introduction, in my case. In the case of wanting to create a series of instances or a data table, for example, you might consider creating a class method that generates a group of instances.