CS312 - Spring 2012 - Class 2
administrative
- assignment 1?
- door code
- text editor?
- keep up with the reading
look at regular expression slides
some questions
- what is a class?
- a template that describe the behavior of a class of objects (generally, the data and methods)
- what are instance variables?
- instance variables are variables that are defined by a class and are associated with a particular object (i.e. an instance of the class)
- what are methods?
- methods are functions that are associated with a class of objects.
- what are accessor and mutator methods?
- accessor methods ask some question about the object
- mutator methods manipulate or change the underlying object
- what is a static variable in Java?
- a variable associated with the class not a particular object of that class
- why are they useful?
- sometimes we may want to aggregate data about the class of objects
- sometimes we may want to communicate data between objects within a class (e.g. locks, semaphors)
- why do we care about classes?
- the key component of object-oriented programming
naming conventions for ruby
- variables, class names, etc: Figure 2.1 from pg. 37 or Ruby
- filenames
- class files: class_name_with_underscores.rb
- other files: descriptive_name_with_underscores.rb
classes in ruby
- say we wanted to define a person class in Java with the following characteristics:
- instance variables
- name
- age
- constructors
- name (defaults to 18 if no age specified)
- name, age
- methods
- name: getter
- age: getter and setter
- is legal to drink
- toString
- look at Person.java in
Classes code
- look at person.rb in
Classes code
- this is the equivalent code in ruby
- what are some differences?
- we see it has two instance variables: @name and @age
- these do NOT need to be defined like in java
- you can just use them. the @ signals that they aren't local variables.
- attr_ define attributes
- think of these like adding getters and setters
- they define methods that can be called externally on the object to access the instance variables
- attr_reader creates a getter method
- :name would create a method name()
- attr_writer creates a setter method
- :name would create a method name= (allowing for assignment)
- attr_accessor creates both getter and setter methods
- they are NOT necessary for defining instance variables
- :name is a symbol (we'll see these a lot and will talk more about them)
- initialize
- think of it like the constructor
- age=18
- specifies an optional parameter
- if one parameter is specified, age defaults to 18
- if two are specified, then the second parameter gets assigned to age
- age and @age are different things
- @age is the instance variable
- age is the parameter
- as we saw before to_s is the equivalent of toString
- look at person_script.rb in
Classes code
- what do you think it does?
- what are some new things?
- to create a new object, we use .new (which calls the initialize method)
- notice if you say "puts some_object" it calls the .to_s method
- the '?' is an operator (this is in C++, Java and other languages)
- it has three components
<boolean> ? <if_true> : <if_false>
- true and false
- the only things that are false in ruby are nil and false
- everything else is true
- we can see what methods a Person object has by calling the .methods method
- like in java, everything inherits from Object, which is where we get all the other methods that we did not define)
- require_relative
- imports the code "relative" to the current location
- basically, starts executing the new file from the top moving down, then comes back to the current file
- for any run, if code is required, will only execute once
- "require" is for built-in (or installed) modules
- what if we wanted to keep track of how many Person objects we'd created?
- how would we do it in java?
- static variable
- in ruby, we can declare "class variables"
- denoted using @@
- only one instance of the variable per class (not per object)
- we can also create class methods (similar to static methods) by adding self. in front of the method name
def self.population
@@total_persons
end
- unlike in java these can only be called using the class and not on an object
- Person.population is legal
- mary.population is NOT legal
inheritance
- let's say we now want to make a student class with the same attributes as the person class, but with more specificity
- inheritance!
- look at student_script.rb
- what attributes does the person class have?
- age and name from Person
- college
- gpa
- ten_point_scale
- look at student.rb in
Classes code
- anything new?
- "<" is used to specify inheritance
- in ruby, you can only inherit from one class (why?)
- notice that @semesters is an instance variables without any accessor methods (i.e. can't be accessed externally)
- we can access @age because we inherited from the class
- instance variables by default are protected
- what is the method ten_point_scale= ?
- ten_point_scale is a virtual attribute
- there is no actual instance variable
- but we can access the object as if there were
building a data structure
- look at
LinkedList code