Object-orientation in Perl
Download
Report
Transcript Object-orientation in Perl
Topic 11: Object-oriented Perl
CSE3395
Perl Programming
Camel3 chapter 12, pages 308-346
perlobj, perltoot, perlbot, perlmod manpages
In this topic
Classes as modules
Defining methods
►
►
►
►
object methods
class methods
constructors
destructors
Creating objects
►
bless keyword
Inheritance
►
►
@ISA array
polymorphism
Comparison with other OO languages
►
Java, C++
2
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Additional information about OO
Advanced Perl Programming
►
chapters 6-8
Object-oriented Perl
►
►
by Damian Conway
Manning Press, first edition 2000
manpages
►
perlmod
– about packages and modules
►
perltoot
– Tom’s object-oriented tutorial; simpler introduction to OO Perl
►
perlobj
– official reference, complete but terse
►
perlbot
– Bag of Object Tricks; some more complex OO stuff
3
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Object-orientation
A class is a description of a type of thing
An object is an instance of a class
A method is a function that operates on a class or object
►
►
class methods (static methods) apply to the class as a whole
object methods (instance methods) apply to one object
A constructor is a method called at object creation
A destructor is a method called at object destruction
Inheritance is the is-a relationship between two classes
►
►
describes default behaviour of a class
derived class inherits from base class
Polymorphism is the selection of the correct derived
method based on the class of the object
4
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Object-orientation in Perl
A class is a description of a type of thing
►
in Perl, class is a module
An object is an instance of a class
►
►
►
in Perl, object is a (usually anonymous) value
object is identified by reference to value
object looks like a scalar
A method is a function that operates on a class or object
►
in Perl, method is a subroutine in the module
A constructor is a method called at object creation
►
in Perl, constructor is a kind of object method which returns a
(blessed) object
Camel3 page 310; perlobj manpage
5
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Using an OO module
use Class;
►
use Car;
Everything else depends on class’ documentation
To call a class method: Class->cmethod(args)
►
►
►
$vehicle = Car->new("ABC123");
new() is class method, doesn’t apply to any specific Car (yet)
new() returns an object (i.e., constructor)
– $vehicle is (a reference to) a Car object
►
nothing special about name “new”, unlike Java/C++
To call an object method: $object->omethod(args)
►
►
$odometer = $vehicle->odometer();
odometer() is object method, applies to a specific Car
Camel3 pages 311-313; perlobj, perltoot manpages
6
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Writing an OO module
Create a package named for the class
►
package Car;
For every method, create a subroutine
sub new { ... }
► sub odometer { ... }
► class and object methods declared the same way
►
End the method with true value
►
1;
Save in module called Class.pm
7
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Writing a class method
To write a class method, declare subroutine
►
sub new {
First parameter ($_[0]) is class name (string)
►
►
usually same as current class, but could be derived
class if it inherited method from current class
my $classname = shift;
Remaining parameters are arguments from
caller
►
my ($plate) = @_;
8
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Writing a constructor
Constructor usually a class method
To create an object:
►
allocate the object’s storage, usually an anonymous hash
– my $auto = { };
►
initialize the object with its default values
– $auto->{"plate"} = $plate;
– $auto->{"ident"} = create_identification();
– $auto->{"odo"} = 0;
►
mark the object as belonging to a class using bless keyword
– bless $auto, $classname;
– bless allows Perl to know which module contains the right
subroutine when invoking an object method
►
return the reference to caller
– return $auto;
Camel3 pages 317-318
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
9
Timeout
# Typical constructor (example of object method).
package Car;
# Constructor new(plate)
# Create and return a new car with specified number plate.
sub new
{
my $classname = shift;
my ($plate) = @_;
my $auto = {
plate => $plate,
ident => create_identification()
odo => 0, # Lifetime odometer
trip => 0 # Trip odometer
};
bless $auto, $classname;
return $auto;
}
10
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Writing an object method
To write a object method, declare subroutine
►
sub odometer {
First parameter ($_[0]) is object (reference to
blessed value)
my $self = shift;
► no special self or this pointer/reference
►
Remaining parameters are arguments from
caller
►
my ($trip, $reset) = @_;
11
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Timeout
# Typical object method.
package Car;
use Carp; # For croak() function below.
# Object method odometer(trip, reset)
# Return either the lifetime (0) or trip (1) odometer,
# and optionally reset it (trip odometer only).
sub odometer
{
my $self = shift;
my ($trip, $reset) = @_;
# croak() is like built-in die() but reports error from
# perspective of caller.
croak("Tried to reset lifetime odometer")
if $reset && !$trip;
my $result = $self->{ $trip ? "trip" : "odo" };
$self->{"trip"} = 0 if $reset;
return $result;
}
12
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Destructors
Destructor is called automatically when object falls out of
scope
►
►
i.e., its reference count falls to zero
not called explicitly
In Perl, destructor is method called DESTROY (all
capitals)
Seldom needed because Perl manages memory
allocation
Some uses
►
►
►
to keep track of class meta-data
to dump persistent objects to disk
to close a file or network connection
Camel3 pages 330-331
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
13
Inheritance
A class can derive from one or more parent
classes by setting the @ISA array
package SportsCar; @ISA = qw(Car
StatusSymbol);
► Any method not found in class SportsCar will now
fall back to the same-named methods in Car and
StatusSymbol
► This is how Exporter.pm module works
►
– @ISA = qw(Exporter);
►
# Inherit export()
Can delegate to superclass (parent) with special
SUPER:: class name
– skips current class when dispatching method
– $self->SUPER::method()
Camel3 pages 321-326; perlobj manpage
14
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Polymorphism
All method calls are dispatched at runtime in
Perl
Method dispatch is based on
class that object was blessed into
► name of method
►
All methods are by default polymorphic
15
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Timeout
package Random;
# new(n): create n-sided Random object.
sub new
{
my $class = shift;
my $self = { range => $_[0] };
return bless $self, $class;
}
# toss(): return result from 1 to object's range.
sub toss
{
my $self = shift;
$self->{"tosses"}++; # Count tosses.
return int (rand $self->{"range"}) + 1;
}
sub DESTROY
{
my $self = shift;
print "Did ", $self->{"tosses"}, " tosses on ", $self->{"range"}, "-sided\n"
}
1;
16
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Timeout
package Die;
use Random;
@ISA = qw(Random);
# Inherit from Random.
# Introduce roll() as synonym for toss()
sub roll
{
my $self = shift;
return $self->toss(@_);
}
1;
17
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Timeout
package Coin;
use Random;
@ISA = qw(Random);
# new(): make a coin object. Coins are 2-sided.
sub new
{
my $class = shift;
$class->SUPER::new(2); # Delegate to parent class, 2 sides.
}
# toss(): return "heads" or "tails"
sub toss
{
my $self = shift;
return $self->SUPER::toss(@_) == 1 ? "heads" : "tail";
}
1;
18
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Timeout
#!/usr/bin/perl -w
use Die;
use Coin;
$c = Coin->new();
$d6 = Die->new(6);
$d10 = Die->new(10);
# Do it 100 times.
foreach (1 .. 100)
{
print $c->toss(), " ",
$d6->roll() + $d10->roll(), "\n";
}
19
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
OO in Perl, Java and C++
Underlying representation
Perl: anonymous hash/array/scalar, looked up by
reference
► C++, Java: opaque structure similar to a C struct
►
Object methods and class methods
Perl: equivalent syntax, distinguished by use
► C++, Java: class methods denoted by static
keyword
►
Class data
Perl: package-level global variables
► C++, Java: variables defined with static keyword
►
20
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
OO in Perl, Java and C++
Instance data
Perl: stored as key/value in object hash
► C++, Java: stored in opaque structure
►
Constructors
Perl: a class method, called explicitly; must allocate
object and initialize it; can have any name
► C++, Java: not strictly a method, called implicitly;
need only initialize the object; new keyword has
special meaning for object construction
►
Destructors
►
Perl, C++, Java: an object method, invoked implicitly
when object falls out of scope
21
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
OO in Perl, Java and C++
Inheritance
►
►
Perl, C++: multiple, using @ISA (Perl) and :public Base
(C++); no difference between inheritance and interfaces
Java: single, using extends; multiple inheritance approximated
with interfaces
Polymorphism
►
►
Perl, Java: applies to all method calls, runtime dispatch
C++: disabled (compile-time dispatch) unless method declared
with virtual keyword
Access control
►
►
Perl: none, relies on programmer to honour documented
interface
C++, Java: enforced at compile time with public, private and
protected keywords; C++ has friend keyword
22
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
OO in Perl, Java and C++
Method overloading
Perl: none, only one method with each name
► C++/Java: all parameter types contribute to method
signature
►
Operator overloading
Perl, C++: yes, with use overload (Perl) and
operator+ (etc.) methods (C++); infix/prefix notation
converted to method calls
► Java: none
►
23
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Covered in this topic
Classes as modules
Defining methods
►
►
►
►
object methods
class methods
constructors
destructors
Creating objects
►
bless keyword
Inheritance
►
►
@ISA array
polymorphism
Comparison with other OO languages
►
Java, C++
24
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University
Going further
Operator overloading
►
Camel3 chapter 13, pages 347-362
Autoloading
generation of methods on the fly
► Camel3 pages 296-298
►
Closures
another way of doing OO
► Camel3 pages 259-263, 339-342
►
25
Original Slides by Debbie Pickett, Modified by David Abramson, 2006, Copyright Monash University