State, Object-Oriented Programming Explicit State, Polymorphism (CTM ) Objects, Classes, and Inheritance (CTM )

Similar documents
Declarative Programming Techniques

Types in Programming Languages Dynamic and Static Typing, Type Inference (CTM 2.8.3, EPL* 4) Abstract Data Types (CTM 3.7) Monads (GIH** 9)

On Academic Dishonesty. Declarative Computation Model. Single assignment store. Single assignment store (2) Single assignment store (3)

Declarative Computation Model

Declarative Concurrency (CTM 4)

Declarative Concurrency (CTM 4)

Carlos Varela RPI September 19, Adapted with permission from: Seif Haridi KTH Peter Van Roy UCL

Programming Language Concepts, cs2104 Lecture 04 ( )

Object Oriented Technology

Logic Programming (CTM ) Constraint Programming: Constraints and Computation Spaces

Programming Language Concepts, CS2104 Lecture 7

Programming Language Concepts, cs2104 Lecture 09 ( )

Lazy evaluation. Lazy evaluation (3) Lazy evaluation (2) Lazy execution. Example. Declarative Concurrency. Lazy Execution (VRH 4.

Concepts, Techniques, and Models of Computer Programming

Don t write anything in the field marked Eventuell ekstra ID. For each subtask, choose the answer you think is the most correct one.

A Concepts-Based Approach for Teaching Programming

proc {Produce State Out} local State2 Out2 in State2 = State + 1 Out = State Out2 {Produce State2 Out2}

Exam for 2G1512 DatalogiII, Apr 12th

Shared state model. April 3, / 29

Lecture 13: Object orientation. Object oriented programming. Introduction. Object oriented programming. OO and ADT:s. Introduction

Lecture 5: Declarative Programming. The Declarative Kernel Language Machine. September 12th, 2011

CMSC330 Fall 2013 Practice Problems 6 Solutions

Weiss Chapter 1 terminology (parenthesized numbers are page numbers)

Programming Language Concepts, cs2104 Lecture 01 ( )

CMSC330. Objects, Functional Programming, and lambda calculus

Programming Languages (CSCI 4430/6430) History, Syntax, Semantics, Essentials, Paradigms

Lecture 7: General Computation Models

Inheritance. Benefits of Java s Inheritance. 1. Reusability of code 2. Code Sharing 3. Consistency in using an interface. Classes

PROFESSOR: DR.JALILI BY: MAHDI ESHAGHI

Lecture 4: The Declarative Sequential Kernel Language. September 5th 2011

Object-Oriented Languages and Object-Oriented Design. Ghezzi&Jazayeri: OO Languages 1

proc {P V1 V2... Vn} <Decl> in <Stmt> end is equivalent to proc {P V1 V2... Vn} local <Decl> in <Stmt> end end, where <Decl> is a

Overview. Distributed Computing with Oz/Mozart (VRH 11) Mozart research at a glance. Basic principles. Language design.

DATA TYPES. CS 403: Types and Classes DATA TYPES (CONT D)

CS558 Programming Languages Winter 2013 Lecture 8

G Programming Languages - Fall 2012

Chapter 11. Categories of languages that support OOP: 1. OOP support is added to an existing language

CSE341: Programming Languages Lecture 9 Function-Closure Idioms. Dan Grossman Winter 2013

Programming Languages (CSCI 4430/6430) Part 1: Functional Programming: Summary

CPS 506 Comparative Programming Languages. Programming Language

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler so far

CS422 - Programming Language Design

n n Try tutorial on front page to get started! n spring13/ n Stack Overflow!

An Oz Subset. 1 Microsyntax for An Oz Subset. Notational Conventions. COP 4020 Programming Languages 1 January 17, 2012

CMSC 330: Organization of Programming Languages. OCaml Imperative Programming

CSCI-GA Scripting Languages

G Programming Languages - Fall 2012

Functional programming Primer I

Chapter 13 Object Oriented Programming. Copyright 2006 The McGraw-Hill Companies, Inc.

Programming Languages and Techniques (CIS120)

Object-Oriented Concepts and Design Principles

Data Abstraction. Hwansoo Han

The role of semantic analysis in a compiler

Graphical Interface and Application (I3305) Semester: 1 Academic Year: 2017/2018 Dr Antoun Yaacoub

CMSC 330: Organization of Programming Languages. Formal Semantics of a Prog. Lang. Specifying Syntax, Semantics

Programming language design and analysis

There are three basic elements in object oriented programming: encapsulation, inheritance and polymorphism.

Tail Calls. CMSC 330: Organization of Programming Languages. Tail Recursion. Tail Recursion (cont d) Names and Binding. Tail Recursion (cont d)

Introduction to OCaml

Chapter 5: Procedural abstraction. Function procedures. Function procedures. Proper procedures and function procedures

"Object Oriented" Programming using ML

G Programming Languages Spring 2010 Lecture 4. Robert Grimm, New York University

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

Chapter 5 Object-Oriented Programming

Lecture 21: Relational Programming II. November 15th, 2011

INF 212 ANALYSIS OF PROG. LANGS FUNCTION COMPOSITION. Instructors: Crista Lopes Copyright Instructors.

Informatica 3 Syntax and Semantics

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler Front-End

Instantiation of Template class

CMSC 330: Organization of Programming Languages. OCaml Imperative Programming

Programmiersprachen (Programming Languages)

Concepts of Programming Languages

On to Objects. CIS 500 Software Foundations Fall November 20. A Change of Pace. Case study: object-oriented programming

ob-ject: to feel distaste for something Webster's Dictionary

Chapter 1. Fundamentals of Higher Order Programming

9 Objects and Classes

More Static Semantics. Static. One-Slide Summary. Lecture Outline. Typing Rules. Dispatch Rules SELF_TYPE

INF 102 CONCEPTS OF PROG. LANGS FUNCTIONAL COMPOSITION. Instructors: James Jones Copyright Instructors.

Compiler Construction Lent Term 2015 Lectures 10, 11 (of 16)

CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping. Dan Grossman Winter 2013

CSE341: Programming Languages Lecture 7 First-Class Functions. Dan Grossman Winter 2013

CIS 500 Software Foundations Fall December 6

Administrivia. Existential Types. CIS 500 Software Foundations Fall December 6. Administrivia. Motivation. Motivation

Programming Languages & Paradigms PROP HT Course Council. Subprograms. Meeting on friday! Subprograms, abstractions, encapsulation, ADT

Harvard School of Engineering and Applied Sciences CS 152: Programming Languages

Background Type Classes (1B) Young Won Lim 6/28/18

Lecture 7: Data Abstractions

CSE 505, Fall 2008, Final Examination 11 December Please do not turn the page until everyone is ready.

- couldn t be instantiated dynamically! - no type or other method of organizing, despite similarity to

Inheritance and Polymorphism

Datatype declarations

What are the characteristics of Object Oriented programming language?

CS 617 Object Oriented Systems Lecture 3 Object Abstractions, Encapsulation, Abstract Data Types 3:30-5:00pm Thu, Jan 10

CS 242. Fundamentals. Reading: See last slide

Lambda Calculus alpha-renaming, beta reduction, applicative and normal evaluation orders, Church-Rosser theorem, combinators

Introduction to the Lambda Calculus

Inheritance and Polymorphism

Programming Languages and Techniques (CIS120)

5. Semantic Analysis!

C++ Important Questions with Answers

Transcription:

State, Object-Oriented Programming Explicit State, Polymorphism (CTM 6.1-6.4.4) Objects, Classes, and Inheritance (CTM 7.1-7.2) Carlos Varela Rensselaer Polytechnic Institute October 27, 2017 Adapted with permission from: Seif Haridi KTH Peter Van Roy UCL C. Varela 1

Declarative operations (1) An operation is declarative if whenever it is called with the same arguments, it returns the same results indepent of any other computation state A declarative operation is: Indepent (deps only on its arguments, nothing else) Stateless (no internal state is remembered between calls) Deterministic (call with same operations always give same results) Declarative operations can be composed together to yield other declarative components All basic operations of the declarative model are declarative and combining them always gives declarative components C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 2

Declarative operations (2) Arguments Declarative operation rest of computation Results C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 3

Why declarative components (1) There are two reasons why they are important: (Programming in the large) A declarative component can be written, tested, and proved correct indepent of other components and of its own past history. The complexity (reasoning complexity) of a program composed of declarative components is the sum of the complexity of the components In general the reasoning complexity of programs that are composed of nondeclarative components explodes because of the intimate interaction between components (Programming in the small) Programs written in the declarative model are much easier to reason about than programs written in more expressive models (e.g., an object-oriented model). Simple algebraic and logical reasoning techniques can be used C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 4

Why declarative components (2) Since declarative components are mathematical functions, algebraic reasoning is possible i.e. substituting equals for equals The declarative model of CTM Chapter 2 guarantees that all programs written are declarative Declarative components can be written in models that allow stateful data types, but there is no guarantee Given f (a) = a 2 We can replace f (a) in any other equation b = 7 f (a) 2 becomes b = 7a 4 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 5

Classification of declarative programming Descriptive Declarative programming Observational Programmable Definitional Declarative model Functional programming The word declarative means many things to many people. Let s try to eliminate the confusion. The basic intuition is to program by defining the what without explaining the how Deterministic logic programming C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 6

Oz kernel language The following defines the syntax of a statement, s denotes a statement s ::= skip empty statement x = y variable-variable binding x = v variable-value binding s 1 s 2 sequential composition local x in s 1 declaration proc { x y 1 y n } s 1 procedure introduction if x then s 1 else s 2 conditional { x y 1 y n } procedure application case x of pattern then s 1 else s 2 pattern matching C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 7

Why the Oz KL is declarative All basic operations are declarative Given the components (sub-statements) are declarative, sequential composition local statement procedure definition procedure call if statement case statement are all declarative (indepent, stateless, deterministic). C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 8

What is state? State is a sequence of values in time that contains the intermediate results of a desired computation Declarative programs can also have state according to this definition Consider the following program fun {Sum Xs A} case Xs of X Xr then {Sum Xr A+X} [] nil then A {Browse {Sum [1 2 3 4] 0}} C. Varela 9

What is implicit state? The two arguments Xs and A represent an implicit state Xs A [1 2 3 4] 0 [2 3 4] 1 [3 4] 3 [4] 6 nil 10 fun {Sum Xs A} case Xs of X Xr then {Sum Xr A+X} [] nil then A {Browse {Sum [1 2 3 4] 0}} C. Varela 10

What is explicit state: Example? An unbound variable A cell C is created with initial value 5 X is bound to C The cell C, which X is bound to, is assigned the value 6 X X X C 5 C 6 C. Varela 11

What is explicit state: Example? An unbound variable A cell C is created with initial value 5 X is bound to C The cell C, which X is bound to, is assigned the value 6 X X X C 5 C 6 The cell is a value container with a unique identity X is really bound to the identity of the cell When the cell is assigned, X does not change C. Varela 12

What is explicit state? X = {NewCell I} Creates a cell with initial value I Binds X to the identity of the cell Example: X = {NewCell 0} {Assign X J} Assumes X is bound to a cell C (otherwise exception) Changes the content of C to become J Y = {Access X} Assumes X is bound to a cell C (otherwise exception) Binds Y to the value contained in C C. Varela 13

Examples X = {NewCell 0} {Assign X 5} Y = X {Assign Y 10} {Access X} == 10 % returns true X == Y % returns true X 0 X 5 Y X 10 Y C. Varela 14

Examples X = {NewCell 10} Y = {NewCell 10} X == Y % returns false Because X and Y refer to different cells, with different identities X 10 Y 10 {Access X} == {Access Y} returns true C. Varela 15

The model exted with cells Semantic stack w = f(x) z = person(a:y) y = α1 u = α2 x single assignment store α1: w α2: x...... mutable store C. Varela 16

The stateful model s ::= skip empty statement s 1 s 2 statement sequence... {NewCell x c } cell creation {Exchange c x y } cell exchange Exchange: bind x to the old content of c and set the content of the cell c to y C. Varela 17

The stateful model {NewCell x c } cell creation {Exchange c x y } cell exchange Exchange: bind x to the old content of c and set the content of the cell c to y proc {Assign C X} {Exchange C _ X} fun {Access C} X in{exchange C X X}X C := X is syntactic sugar for {Assign C X} @C is syntactic sugar for {Access C} X=C:=Y is syntactic sugar for {Exchange C X Y} C. Varela 18

Abstract data types (revisited) For a given functionality, there are many ways to package the ADT. We distinguish three axes. Open vs. secure ADT: is the internal representation visible to the program or hidden? Declarative vs. stateful ADT: does the ADT have encapsulated state or not? Bundled vs. unbundled ADT: is the data kept together with the operations or is it separable? Let us see what our stack ADT looks like with some of these possibilities C. Varela 19

Stack: Open, declarative, and unbundled Here is the basic stack, as we saw it before: fun {NewStack} nil fun {Push S E} E S fun {Pop S E} case S of X S1 then E=X S1 fun {IsEmpty S} S==nil This is completely unprotected. Where is it useful? Primarily, in small programs in which expressiveness is more important than security. C. Varela 20

Stack: Secure, declarative, and unbundled We can make the declarative stack secure by using a wrapper: local Wrap Unwrap in {NewWrapper Wrap Unwrap} fun {NewStack} {Wrap nil} fun {Push S E} {Wrap E {Unwrap S}} fun {Pop S E} case {Unwrap S} of X S1 then E=X {Wrap S1} fun {IsEmpty S} {Unwrap S} ==nil Where is this useful? In large programs where we want to protect the implementation of a declarative component. C. Varela 21

Stack: Secure, stateful, and unbundled Let us combine the wrapper with state: local Wrap Unwrap in {NewWrapper Wrap Unwrap} fun {NewStack} {Wrap {NewCell nil}} proc {Push W X} C={Unwrap W} in {Assign C X {Access C}} fun {Pop W} C={Unwrap W} in case {Access C} of X S then {Assign C S} X fun {IsEmpty W} {Access {Unwrap W}}==nil This version is stateful but lets us store the stack separate from the operations. The same operations work on all stacks. C. Varela 22

Stack: Secure, stateful, and bundled This is the simplest way to make a secure stateful stack: proc {NewStack?Push?Pop?IsEmpty} C={NewCell nil} in proc {Push X} {Assign C X {Access C}} fun {Pop} case {Access C} of X S then {Assign C S} X fun {IsEmpty} {Access C} ==nil Compare the declarative with the stateful versions: the declarative version needs two arguments per operation, the stateful version uses higher-order programming (instantiation) With some syntactic support, this is object-based programming C. Varela 23

Four ways to package a stack Open, declarative, and unbundled: the usual declarative style, e.g., in Prolog and Scheme Secure, declarative, and unbundled: use wrappers to make the declarative style secure Secure, stateful, and unbundled: an interesting variation on the usual object-oriented style Secure, stateful, and bundled: the usual object-oriented style, e.g., in Smalltalk and Java Other possibilities: there are four more possibilities! Exercise: Try to write all of them. C. Varela 24

Encapsulated stateful abstract datatypes ADT These are stateful entities that can be accessed only by the external interface The implementation is not visible outside We show two methods to build stateful abstract data types: The functor based approach (record interface) The procedure dispatch approach C. Varela; Adapted from S. Haridi and P. Van Roy 25

The functor-based approach fun {NewCounter I} S = {NewCell I} proc {Inc} S := @S + 1 proc {Dec} S := @S - 1 fun {Get} @S proc {Put I} S := I proc {Display} {Browse @S} in o(inc:inc dec:dec get:get put:put display:display) C. Varela; Adapted from S. Haridi and P. Van Roy 26

The functor-based approach fun {NewCounter I} S = {NewCell I} proc {Inc} S := @S + 1 proc {Dec} S := The @S state - 1 is collected in cell S fun {Get} @S The state is completely encapsulated proc {Put I} S := i.e. I not visible outside proc {Display} {Browse @S} in o(inc:inc dec:dec get:get put:put browse:display) C. Varela; Adapted from S. Haridi and P. Van Roy 27

The functor-based approach fun {NewCounter I} S = {NewCell I} proc {Inc} S := @S + 1 proc {Dec} S := @S - 1 The interface is created for each fun {Get} @S instance Counter proc {Put I} S := I proc {Display} {Browse @S} in o(inc:inc dec:dec get:get put:put display:display) C. Varela; Adapted from S. Haridi and P. Van Roy 28

The functor-based approach fun {NewCounter I} S = {NewCell I} proc {Inc} S := @S + 1 proc {Dec} S := @S - 1 fun {Get} @S proc {Put I} S := I functions that access the state by lexical scope proc {Display} {Browse S.v} in o(inc:inc dec:dec get:get put:put display:display) C. Varela; Adapted from S. Haridi and P. Van Roy 29

Call pattern declare C1 C2 C1 = {NewCounter 0} C2 = {NewCounter 100} {C1.inc} {C1.display} {C2.dec} {C2.display} C. Varela; Adapted from S. Haridi and P. Van Roy 30

Defined as a functor functor Counter export inc:inc dec:dec get:get put:put display:display init:init define S proc {Init init(i)} S = {NewCell I} proc {Inc} S := @S + 1 proc {Dec} S := @S - 1 fun {Get} @S proc {Put I} S := I proc {Display} {Browse @S} C. Varela; Adapted from S. Haridi and P. Van Roy 31

Functors Functors have been used as a specification of modules Also functors have been used as a specification of abstract datatypes How to create a stateful entity from a functor? C. Varela; Adapted from S. Haridi and P. Van Roy 32

Explicit creation of objects from functors Given a variable F that is bound to a functor [O] = {Module.apply [F]} creates stateful ADT object O that is an instance of F Given the functor F is stored on a file f.ozf [O] = {Module.link [ f.ozf ]} creates stateful ADT object O that is an instance of F C. Varela; Adapted from S. Haridi and P. Van Roy 33

Defined as a functor functor Counter export inc:inc dec:dec get:get put:put display:display init:init define S proc {Init init(i)} S = {NewCell I} proc {Inc} S := @S + 1 proc {Dec} S := @S - 1 fun {Get} @S proc {Put I} S := I proc {Display} {Browse @S} C. Varela; Adapted from S. Haridi and P. Van Roy 34

Pattern of use fun {New Functor Init} End M in [M] = {Module.apply [Functor]} {M.init Init} M Generic function to create objects from functors declare C1 C2 C1 = {New Counter init(0)} C2 = {New Counter init(100)} {C1.inc} {C1.put 50} {C1.display} {C2.dec} {C2.display} Object interface is a record with procedure values inside fields C. Varela; Adapted from S. Haridi and P. Van Roy 35

The procedure-based approach fun {Counter} S proc {Inc inc(value)} S := @S + Value proc {Display display} {Browse @S} proc {Init init(i)} S = {NewCell I} D = o(inc:inc display:display init:init) in proc{$ M} {D.{Label M} M} C. Varela; Adapted from S. Haridi and P. Van Roy 36

The procedure-based approach fun {Counter} S... D = o(inc:inc display:display init:init) in proc{$ M} {D.{Label M} M} fun {New Class InitialMethod} O = {Class} in {O InitialMethod} O C. Varela; Adapted from S. Haridi and P. Van Roy 37

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} {C inc(1)} {C display} Object interface is as a procedure of one argument, which expects a record C. Varela; Adapted from S. Haridi and P. Van Roy 38

Object-oriented programming Supports Encapsulation Compositionality Instantiation Plus Inheritance C. Varela; Adapted from S. Haridi and P. Van Roy 39

Inheritance Programs can be built in hierarchical structure from ADT s that dep 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 40

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 41

Instances (objects) Interface (what methods are available) State (attributes) Procedures (methods) C. Varela; Adapted from S. Haridi and P. Van Roy 42

Classes (simplified syntax) A class is a statement class ClassVariable attr AttrName1 : AttrNameN meth Pattern1 Statement : meth PatternN Statement C. Varela; Adapted from S. Haridi and P. Van Roy 43

Classes (simplified syntax ) A class can also be a value that can be in an expression position class $ attr AttrName1 : AttrNamen meth Pattern Statement : meth Pattern Statement C. Varela; Adapted from S. Haridi and P. Van Roy 44

Classes in Oz The class Counter has the syntactic form class Counter attr val meth display {Browse @val} meth inc(value) val := @val + Value meth init(value) val := Value C. Varela; Adapted from S. Haridi and P. Van Roy 45

Attributes of Classes The class Counter has the syntactic form class Counter attr val meth display {Browse @val} meth inc(value) val := @val + Value meth init(value) val := Value val is an attribute: a modifiable cell that is accessed by the atom val C. Varela; Adapted from S. Haridi and P. Van Roy 46

Attributes of classes The class Counter has the syntactic form class Counter attr val meth display {Browse @val} meth inc(value) val := @val + Value meth init(value) val := Value the attribute val is accessed by the operator @val C. Varela; Adapted from S. Haridi and P. Van Roy 47

Attributes of classes The class Counter has the syntactic form class Counter attr val meth display {Browse @val} meth inc(value) val := @val + Value meth init(value) val := Value the attribute val is assigned by the operator := as val :=... C. Varela; Adapted from S. Haridi and P. Van Roy 48

Methods of classes The class Counter has the syntactic form class Counter attr val meth display {Browse @val} meth inc(value) val := @val + Value meth init(value) val := Value methods are statements method head is a record (tuple) pattern C. Varela; Adapted from S. Haridi and P. Van Roy 49

Classes in Oz The class Counter has the syntactic form class Counter attr val meth display {Browse @val} meth inc(value) val := @val + Value meth init(value) val := Value C. Varela; Adapted from S. Haridi and P. Van Roy 50

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 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 51

Summary A class X is defined by: class X... Attributes are defined using the attribute-declaration part before the method-declaration part: attr A 1... A N Then follows the method declarations, each has the form: meth E S 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 52

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 $... C. Varela; Adapted from S. Haridi and P. Van Roy 53

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 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 54

Attribute Initialization Initialization by instance class Account attr balance meth init(x) balance := X O1 = {New Account init(100)} O2 = {New Account init(50)} C. Varela; Adapted from S. Haridi and P. Van Roy 55

Attribute Initialization Initialization by brand declare L=linux class RedHat attr ostype:l meth get(x) X = @ostype class SuSE attr ostype:l meth get(x) X = @ostype class Debian attr ostype:l meth get(x) X = @ostype C. Varela; Adapted from S. Haridi and P. Van Roy 56

class Queue attr front back count meth init Q in front := Q back := Q count := 0 meth put(x) Q in @back = X Q back := Q count := @count + 1... Example C. Varela; Adapted from S. Haridi and P. Van Roy 57

Example class Queue attr front back count meth init Q in front := Q back := Q count := 0 meth put(x) Q in @back = X Q back := Q count := @count + 1... front back put(a) front back Q0 a Q1 C. Varela; Adapted from S. Haridi and P. Van Roy 58

Example class Queue attr front back count... meth get(?x) Q in X Q = @front front := Q count := @count - 1 meth count(?x) X = @count... front back front back a Q1 X a Q1 X C. Varela; Adapted from S. Haridi and P. Van Roy 59

Classes as incremental ADTs Object-oriented programming allows us to define a class by exting 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 The notion of delegation as a substitute for inheritance C. Varela; Adapted from S. Haridi and P. Van Roy 60

Inheritance Inheritance should be used as a way to specialize a class while retaining the relationship between methods In this way it is a 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 61

Inheritance class Account attr balance:0 meth transfer(amount) balance := @balance+amount meth getbal(b) B = @balance A={New Account transfer(100)} C. Varela; Adapted from S. Haridi and P. Van Roy 62

Inheritance II Conservative extension class VerboseAccount from Account meth verbosetransfer(amount)... The class VerboseAccount has the methods: transfer, getbal, and verbosetransfer C. Varela; Adapted from S. Haridi and P. Van Roy 63

Inheritance II Non-Conservative extension class AccountWithFee from VerboseAccount attr fee:5 meth transfer(amount)... 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 64

Inheritance II Non-Conservative extension class AccountWithFee from VerboseAccount attr fee:5 meth transfer(amount)... Account VerboseAccount AccountWithFee C. Varela; Adapted from S. Haridi and P. Van Roy 65

Polymorphism The ability for operations to take objects (instances) of different types. For example, the transfer method can be invoked in account object instances of three different classes. The most specific behavior should be executed. Account VerboseAccount AccountWithFee C. Varela; Adapted from S. Haridi and P. Van Roy 66

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) class C meth M O an instance of D class D a subclass of C meth M C. Varela; Adapted from S. Haridi and P. Van Roy 67

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 68

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 69

Exercises 63. Do Java and C++ object abstractions completely encapsulate internal state? If so, how? If not, why? 64. Do Java and C++ enable static access to methods defined in classes arbitrarily high in the inheritance hierarchy? If so, how? If not, why? 65. Exercise CTM 7.9.1 (pg 567) 66. Exercise CTM 7.9.7 (pg 568) C. Varela; Adapted from S. Haridi and P. Van Roy 70