Object-Oriented Programming
Objects, Classes and Inheritance (VRH 7.1-4)
Polymorphism (VRH 6.4.3)
Carlos Varela
RPI
Adapted with permission from:
Seif Haridi
KTH
Peter Van Roy
UCL
C. Varela; Adapted from S. Haridi and P. Van Roy
1
Overview
•
What is object-oriented programming?
– Objects
– Classes
– Interfaces
•
•
•
•
•
•
•
•
Inheritance
Polymorphism
Static and dynamic binding
Multiple Inheritance
Method dispatching, multi-methods
Reflection
Active Objects
Relationship to Other Programming Models
C. Varela; Adapted from S. Haridi and P. Van Roy
2
System building
• Abstraction is the best tool to build complex systems
• Complex systems are built by layers of abstractions
• Each layer has two parts:
– Specification, and
– Implementation
• Any layer uses the specification of the lower layer to
implement its functionality
C. Varela; Adapted from S. Haridi and P. Van Roy
3
Properties needed to support the
principle of abstraction
• Encapsulation
– Hide internals from the interface
• Compositionality
– Combine parts to make new parts
• Instantiation/invocation
– Create new instances of parts
C. Varela; Adapted from S. Haridi and P. Van Roy
4
Component-based programming
• Supports
– Encapsulation
– Compositionality
– Instantiation
C. Varela; Adapted from S. Haridi and P. Van Roy
5
Object-oriented programming
• Supports
– Encapsulation
– Compositionality
– Instantiation
• Plus
– Inheritance
C. Varela; Adapted from S. Haridi and P. Van Roy
6
Inheritance
• Programs can be built in hierarchical structure from ADT’s
that depend on other ADT’s (Components)
• Object-oriented programming (inheritance) is based on the
idea that ADTs have so much in common
• For example, sequences (stacks, lists, queues)
• Object oriented programming enables building ADTs
incrementally, through inheritance
• An ADT can be defined to inherit from another abstract
data type, substantially sharing functionality with that
abstract data type
• Only the difference between an abstract datatype and its
ancestor has to be specified
C. Varela; Adapted from S. Haridi and P. Van Roy
7
What is object-oriented
programming?
• OOP (Object-oriented programming) = encapsulated state
+ inheritance
• Object
– An entity with unique identity that encapsulates state
– State can be accessed in a controlled way from outside
– The access is provided by means of methods (procedures that can
directly access the internal state)
• Class
– A specification of objects in an incremental way
– Incrementality is achieved inheriting from other classes by
specifying how its objects (instances) differ from the objects of the
inherited classes
C. Varela; Adapted from S. Haridi and P. Van Roy
8
Instances (objects)
Interface (what methods
are available)
State (attributes)
Procedures (methods)
C. Varela; Adapted from S. Haridi and P. Van Roy
9
Classes (simplified syntax)
A class is a statement
class ClassVariable
attr
AttrName1
:
AttrNameN
meth Pattern1 Statement end
:
meth PatternN Statement end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
10
Classes (simplified syntax)
A class can also be a value that can be in an expression position
class $
attr
AttrName1
:
AttrNamen
meth Pattern Statement end
:
meth Pattern Statement end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
11
Classes in Oz
The class Counter has the syntactic form
class Counter
attr val
meth display
{Browse @val}
end
meth inc(Value)
val := @val + Value
end
meth init(Value)
val := Value
end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
12
Attributes of Classes
The class Counter has the syntactic form
class Counter
attr val
meth display
{Browse @val}
end
meth inc(Value)
val := @val + Value
end
meth init(Value)
val := Value
end
end
val is an attribute:
a modifiable cell
that is accessed by the
atom val
C. Varela; Adapted from S. Haridi and P. Van Roy
13
Attributes of classes
The class Counter has the syntactic form
class Counter
attr val
meth display
{Browse @val}
end
meth inc(Value)
val := @val + Value
end
meth init(Value)
val := Value
end
end
the attribute val
is accessed by the
operator @val
C. Varela; Adapted from S. Haridi and P. Van Roy
14
Attributes of classes
The class Counter has the syntactic form
class Counter
attr val
meth display
{Browse @val}
end
meth inc(Value)
val := @val + Value
end
meth init(Value)
val := Value
end
end
the attribute val
is assigned by the
operator :=
as val := ...
C. Varela; Adapted from S. Haridi and P. Van Roy
15
Methods of classes
The class Counter has the syntactic form
class Counter
attr val
meth display
{Browse @val}
end
meth inc(Value)
val := @val + Value
end
meth init(Value)
val := Value
end
end
methods
are statements
method head is a
record (tuple) pattern
C. Varela; Adapted from S. Haridi and P. Van Roy
16
Classes in Oz
The class Counter has the syntactic form
class Counter
attr val
meth display
{Browse @val}
end
meth inc(Value)
val := @val + Value
end
meth init(Value)
val := Value
end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
17
Example
• An object is created from a class using the procedure
New/3, whose first argument is the class, the second is the
initial method, and the result is the object (such as in the
functor and procedure implementation approaches)
• New/3 is a generic procedure for creating objects from
classes.
declare C = {New Counter init(0)}
{C display}
{C inc(1)}
{C display}
C. Varela; Adapted from S. Haridi and P. Van Roy
18
Example
• The following shows how an object is created from
a class using the procedure New/3, whose first
argument is the class, the second is the initial
method, and the result is the object.
• New/3 is a generic procedure for creating objects
from classes.
declare C = {New Counter init(0)}
{C display}
Object interface is as a
{C inc(1)}
procedure of one argument,
{C display}
which expects a record
representing a method
C. Varela; Adapted from S. Haridi and P. Van Roy
19
Summary
• A class X is defined by:
– class X ... end
• Attributes are defined using the attribute-declaration
part before the method-declaration part:
– attr A1 ... AN
• Then follow the method declarations, each has the
form:
– meth E S end
• The expression E evaluates to a method head, which is
a record whose label is the method name.
C. Varela; Adapted from S. Haridi and P. Van Roy
20
Summary
• An attribute A is accessed using @A.
• An attribute is assigned a value using A := E
• A class can be defined as a value:
• X = class $ ... end
C. Varela; Adapted from S. Haridi and P. Van Roy
21
Attribute Initialization
• Stateful (may be updated by :=)
• Initialized at object creation time, all instances
have the initial balance = 0
• class Account
attr balance:0
meth … end
…
end
In general the initial value
of an attribute could be any
legal value (including
classes and objects)
C. Varela; Adapted from S. Haridi and P. Van Roy
22
Attribute Initialization
• Initialization by instance
class Account
attr balance
meth init(X) balance := X end
…
end
• C1 = {New Account init(100)}
• C1 = {New Account init(50)}
C. Varela; Adapted from S. Haridi and P. Van Roy
23
Attribute Initialization
• Initialization by brand
declare L=linux
class RedHat
attr ostype:L
meth get(X) X = @ostype end
end
class SuSE
attr ostype:L
meth get(X) X = @ostype end
end
class Debian
attr ostype:L
meth get(X) X = @ostype end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
24
Example
class Queue
attr front back count
meth init
Q in
front := Q back := Q count := 0
end
meth put(X)
Q in
@back = X|Q
back := Q
count := @count + 1
end
...
end
C. Varela; Adapted from S. Haridi and P. Van Roy
25
Example
class Queue
attr front back count
meth init
Q in
front := Q back := Q count := 0
end
meth put(X)
Q in
@back = X|Q
back := Q
count := @count + 1
end
...
end
front
Q0
back
put(a)
front
a | Q1
back
C. Varela; Adapted from S. Haridi and P. Van Roy
26
Example
class Queue
attr front back count
...
meth get(?X)
Q in
X|Q = @front
front := Q
count := @count - 1
end
meth count(X) X = @count end
...
end
front
a | Q1
back
X
front
a | Q1
back
X
C. Varela; Adapted from S. Haridi and P. Van Roy
27
Classes as incremental ADTs
• Object-oriented programming allows us to define a class
by extending existing classes
• Three things have to be introduced
– How to express inheritance, and what does it mean?
– How to access particular methods in the new class and in
preexisting classes
– Visibility – what part of the program can see the attributes and
methods of a class
C. Varela; Adapted from S. Haridi and P. Van Roy
28
Inheritance
• Inheritance should be
used as a way to
specialize a class while
retaining the relationship
between methods
• In this way it is just an
extension of an ADT
• The other view is
inheritance is just a (lazy)
way to construct new
abstract data types!
• No relationships are
preserved
general
class
specialized
class
C. Varela; Adapted from S. Haridi and P. Van Roy
29
Inheritance
class Account
attr balance:0
meth transfer(Amount)
balance := @balance+Amount
end
meth getBal(B)
B = @balance
end
end
A={New Account transfer(100)}
C. Varela; Adapted from S. Haridi and P. Van Roy
30
Inheritance II
Conservative extension
The class VerboseAccount has
the methods:
transfer, getBal, and
verboseTransfer
class VerboseAccount
from Account
meth verboseTransfer(Amount)
...
end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
31
Inheritance II
Non-Conservative extension
class AccountWithFee
from VerboseAccount
attr fee:5
meth transfer(Amount)
...
end
end
The class AccountWithFee has the
methods:
transfer, getBal, and verboseTransfer
The method transfer has been
redefined (overridden) with
another definition
C. Varela; Adapted from S. Haridi and P. Van Roy
32
Inheritance II
Non-Conservative extension
class AccountWithFee
from VerboseAccount
attr fee:5
meth transfer(Amount)
...
end
end
Account
VerboseAccount
AccountWithFee
C. Varela; Adapted from S. Haridi and P. Van Roy
33
Polymorphismn
The ability for operations to take
objects (instances) of different
types.
Account
For example, the transfer method
can be invoked in account object
instances of three different
classes.
VerboseAccount
AccountWithFee
The most specific behavior
should be executed.
C. Varela; Adapted from S. Haridi and P. Van Roy
34
Static and dynamic binding
Dynamic binding
• Inside an object O we want to
invoke a method M
• This is written as {self M}, and
chooses the method visible in
the current object (M of D)
O
an instance
of D
class C
meth M
class D
a subclass of
C
meth M
C. Varela; Adapted from S. Haridi and P. Van Roy
35
Static and dynamic binding
Static binding
• Inside an object O we want to
invoke a method M in a specific
(super) class
• This is written as C, M and
chooses the method visible in
the super class C (M of C)
O
an instance
of D
class C
meth M
class D
a subclass of
C
meth M
C. Varela; Adapted from S. Haridi and P. Van Roy
36
Static method calls
• Given a class and a method head m(…), a static method-call
has the following form:
C, m(…)
• Invokes the method defined in the class argument.
• A static method call can only be used inside class
definitions.
• The method call takes the current object denoted by self as
implicit argument.
• The method m could be defined in the class C, or inherited
from a super class.
C. Varela; Adapted from S. Haridi and P. Van Roy
37
Inheritance
class Account
attr balance:0
meth transfer(Amount)
balance := @balance+Amount
end
meth getBal(B)
B = @balance
end
end
A={New Account transfer(100)}
C. Varela; Adapted from S. Haridi and P. Van Roy
38
Inheritance II
Conservative extension
The class VerboseAccount has
the methods:
transfer, getBal, and
verboseTransfer
class VerboseAccount
from Account
meth verboseTransfer(Amount)
{self transfer(Amount)}
{Browse @balance}
end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
39
Inheritance II
Non-Conservative extension
class AccountWithFee
from VerboseAccount
attr fee:5
meth transfer(Amount)
VerboseAccount, transfer(Amount - @fee)
end
end
The class
AccountWithFee has the
methods:
transfer, getBal, and
verboseTransfer
The method transfer
has been redefined
(overridden) with
another definition
C. Varela; Adapted from S. Haridi and P. Van Roy
40
Inheritance II
Non-Conservative extension
class AccountWithFee
from VerboseAccount
attr fee:5
meth transfer(Amount)
VerboseAccount, transfer(Amount - @fee)
end
end
Non-Conservative
inheritance is dangerous
because it might change
the relationship between
methods and the invariants
the programmer depends
on
Account
getBalance(B); transfer(S); getBalance(B1) => B1 = B+S
C. Varela; Adapted from S. Haridi and P. Van Roy
41
Inheritance II
Non-Conservative extension
class AccountWithFee
from VerboseAccount
attr fee:5
meth transfer(Amount)
VerboseAccount, transfer(Amount - @fee)
end
end
Non-Conservative
inheritance is dangerous
because it might change
the relationship between
methods and the invariants
the programmer depends
on
AccountWithFee
getBalance(B); transfer(S); getBalance(B1) => B1 = [email protected]
C. Varela; Adapted from S. Haridi and P. Van Roy
42
Inheritance III
•
•
•
Classes may inherit from one or several classes appearing after the keyword: from.
A class B is a superclass of a class A if:
– B appears in the from declaration of A, or
– B is a superclass of a class appearing in the from declaration of A.
The methods (attributes and features) available in a class C (i.e. visible) are defined
through a precedence relation on the methods that appear in the class hierarchy based
on the overriding relation:
– A method in a class C overrides any method, with the same label, in any super
class of C.
C. Varela; Adapted from S. Haridi and P. Van Roy
43
SuperClass relation
• SuperClass relation is directed
and acyclic.
C
C. Varela; Adapted from S. Haridi and P. Van Roy
44
SuperClass relation
• SuperClass relation is directed
and acyclic.
• After striking out all overridden
methods each remaining method
should have a unique label and be
defined only in one class in the
hierarchy.
C
C. Varela; Adapted from S. Haridi and P. Van Roy
45
Inheritance relation
m
m
m
m
C
A (valid hierarchy)
(invalid hierarchy)
C. Varela; Adapted from S. Haridi and P. Van Roy
46
Multiple Inheritance Example
class Account
attr balance:0
meth transfer(Amount)
balance  @balance+Amount
end
meth getBal(?B) B = @balance end
end
class Customer
attr name
meth init(N) name  N end
end
class CustomerAccount from Customer Account end
A={New CustomerAccount init}
C. Varela; Adapted from S. Haridi and P. Van Roy
47
Illegal inheritance
class Account
attr balance
meth init(Amount)
There are two init methods
balance  Amount
visible for CustomerAccount
end
This is illegal
meth transfer(Amount)
balance  @balance+Amount
end
meth getBal(B) B = @balance end
end
class Customer
attr name
meth init(N) name  N end
end
class CustomerAccount from Customer Account end
C. Varela; Adapted from S. Haridi and P. Van Roy
48
Legal inheritance
class Account
attr balance
meth init(Amount) balance  Amount end
meth transfer(Amount) balance  @balance+Amount end
meth getBal(B) B = @balance end
end
class Customer
attr name
meth init(N) name  N end
end
class CustomerAccount from Customer Account
meth init(N A)
Customer, init(N)
Account, init(A)
end
end
CustomerAccount has
attributes balance and name
methods init, transfer and
getBalance
This overriding is not
harmful: it does not
change relationships
in super classes
C. Varela; Adapted from S. Haridi and P. Van Roy
49
Controlling visibility
• Visibility is the control given to the user to limit access to
members of a class (attributes, methods and properties)
• Each member is defined with a scope (part of program text
that the member can be accessed by name)
• Programming languages use words like public, private and
protected to define visibility
• Unfortunately different languages use these keywords to
define different scopes
C. Varela; Adapted from S. Haridi and P. Van Roy
50
Public and private scopes in ADTs
• A private member is one which is only visible in the object
instance (it is used for implementing the ADT)
• The object instance can see all the private members in its
class and its super classes
• A public member is visible anywhere in the program
• It is part of the interface of the ADT
• In Oz (and Smalltalk) attributes are private and methods
are public (the default rule)
• In Java and C++ private has another meaning
C. Varela; Adapted from S. Haridi and P. Van Roy
51
The meaning of Private
C
Class Hierarchy
SubC
SubSubC
Instances
I1
I2
I3
I4
C. Varela; Adapted from S. Haridi and P. Van Roy
52
The meaning of Private
C
Class Hierarchy
SubC
According to
Smalltalk and Oz
All private members
in this region are visible
to I3
SubSubC
Instances
I1
I2
I3
I4
C. Varela; Adapted from S. Haridi and P. Van Roy
53
The meaning of Private
C
Class Hierarchy
SubC
According to
C++ and Java
All private members
in this region are visible
to I3
SubSubC
Instances
I1
I2
I3
I4
C. Varela; Adapted from S. Haridi and P. Van Roy
54
Public and private scopes in ADTs
• In Oz (and Smalltalk) attributes
are private and methods are
public
• It is possible in Oz to make a
method private within a class
class C
meth A(...) ... end
....
end
• Using a variable identifier as a
method head will make the
method local to the class
• The variable is automatically
bound to a unique name
C. Varela; Adapted from S. Haridi and P. Van Roy
55
Public and private scopes in ADTs
• In Oz (and Smalltalk) attributes
are private and methods are
public
• It is possible in Oz to make a
method private within a class
• Using a variable identifier as a
method head will make the
method local to the class
• The variable is automatically
bound to a unique name
• ! is an escape character, !A
means escape the class scope
class C
meth A(...) ... end
....
end
local A = {NewName} in
class C
meth !A(...) ... end
....
end
end
C. Varela; Adapted from S. Haridi and P. Van Roy
56
Exercises
•
•
•
•
•
•
Do Java and C++ object abstractions completely
encapsulate internal state? If so, how? If not, why?
Do Java and C++ enable static access to methods defined
in classes arbitrarily high in the inheritance hierarchy? If
so, how? If not, why?
Do Java and C++ allow multiple inheritance? If so, how?
If not, why?
Exercises VRH 7.9.1-4 (pg 567)
Exercise VRH 7.9.7 (pg 568)
Read VRH Sections 7.5, 7.7 and Multijava paper.
C. Varela; Adapted from S. Haridi and P. Van Roy
57
Descargar

Introduction to Programming