Introduction to Classes and Objects Initializing Objects Making
Introduction to Classes and Objects Initializing Objects Making Use of Classes in Algorithms Class Examples
Introduction to Classes and Objects
The Scenario • We want to provide a “black box” approach to reusable components… Input Don’t know how it works, but it works! Output
The Scenario • We want to create reusable components for other programmers to use. • They are focused on their work and don’t want to know the details of how our component works. • They are also busy trying to do their work, so maybe they’ll take shortcuts and “hack. ” • We want to provide services to them but protect the implementation details of our components.
Classes • A class is the fundamental unit of object-oriented programming. • It allows us to implement ADTs, combining both data and operations into one logical bundle.
Objects • Once we have a class defined, we can then declare any number of objects of that class. For example: • Once we have a queue class defined, we can then declare any number of queue objects. • Each queue object will then have all the data and procedural abstractions needed for a queue.
Classes and Objects • A class is like a blueprint: • An object is an instantiated class (like a building):
Classes vs. Objects • Class refers to the template by which we implement an ADT’s functionality. Thus, it is analogous to data type: it is only a definition or template. • Object refers to a specific instance of the class. Thus, it is analogous to variable: it is an instance of a template. Class : Object : : Type : Variable
Classes Allow for Reuse! • Algorithms which make use of the queue class (by declaring instances of the queue, or objects) are clients who obtain services: algorithm Movie_Theatre algorithm Restaurant algorithm Check-out_Line • The authors of these algorithms can instantiate and use queues without writing them!
Components of a Class • The individual data elements of a class are referred to as attributes of the class. • The entire collection of data maintained within an object is referred to as the state of the object. • The operations (procedures and functions) that are provided by the class (and thus allowed on the data) are called the methods of the class.
Controlling Visibility • Recall we want to protect the implementation of the class. – Users shouldn’t need to know how it works – Users shouldn’t be able to violate the behaviors (may only do what we allow them). • Encapsulation allows us to hide the implementation details.
Public vs. Protected Public
Visibility Within a Class The rest of the algorithm Public Section (Interface) Protected Section (Implementation)
Anatomy of a Classes have two sections: • Public - the specification of the "visible” part of the class • Protected - the specification of the "hidden” part of the class
Public Section • Contains everything that the client algorithm needs to know to use the class • Is the visible part of the class • Defines the interface and contract with the user (algorithm) • Contains the header lines of those methods that are available for clients of the class to call.
Protected Section • Contains the details of the implementation of the class • Cannot be seen by the client algorithm • Hides attributes and method implementation • Contains all method declarations and implementations.
Client Algorithm Interactions Public Module Definitions and Contract Supplier Object Protected Data & Implementation of Modules
Encapsulation and Hiding • A client algorithm can see only the public section of the class. A client has no idea what is within the protected section. • A client algorithm can interact with an object only by calling the methods listed in the public section of the class. • A client algorithm cannot directly access any of the data within an object. It may “get at” data only via calls to public methods.
Public vs. Protected Methods public method 1 Some Class class data public method 2 public method 3 a protected method • Clients may call any/all of the three public methods. • Clients don’t know the hidden method exists; they cannot call it.
Protected Methods • A protected method is one which is defined in the protected section that does not have its header line in the public section. • Clients don’t even know it exists. • Such a method may only be called by other methods within the protected section.
Structure of a Class Definition class <identifier> public <method definitions and contracts> protected <constants> <type definitions> <attribute declarations> <method implementations> endclass // <identifier>
A Bus Class Example Bus Initialize Add Passengers Remove Passengers Number of Passengers MAX_PASSENGERS Current Implementation
class Bus public procedure Initialize // contract here procedure Add. Passengers (to_add iot in num) // contract here function Num. Passengers returnsa num // contract here procedure Remove. Passengers (to_remove iot in num) // contract here protected MAX_PASSENGERS is 50 current isoftype num procedure Initialize current <- 0 endprocedure // Initialize
procedure Add. Passengers (to_add iot in num) if (current + to_add <= MAX_PASSENGERS) then current <- current + to_add endif endprocedure // Add. Passengers function Num. Passengers returnsa num Nun. Passengers returns current endfunction // Num. Passengers procedure Remove. Passengers (to_remove iot in num) if (current >= to_remove) then current <- current – to_remove endif endprocedure // Remove. Passengers endclass // Bus
Recipe for Writing a Class • Write shell/template • Decide on what the user needs to know about - PUBLIC • Specify the protected data • Diagram & think of sample algorithm • Write public section with contract information • Write protected section with implementation details
Attribute Visibility in the Protected Section Variables declared at the global level of the protected section can be directly accessed throughout the protected section without passing them via parameter. protected current isoftype num. . . procedure Add. Passengers (to_add iot in num) if (current + to_add <= MAX_PASSENGERS) then current <- current + to_add endif endprocedure // Add. Passengers function Num. Passengers returnsa num Nun. Passengers returns current endfunction // Num. Passengers. . .
Attribute Visibility in the Protected Section • Allow direct access, bypassing parameters! • May want clients of the class to be able to call methods • Don't want clients to know the details of the protected section's data representation. • If method parameter lists included data that's protected, then would be telling the client about that representation. • So, allow direct access within protected • Still have encapsulation (the class itself)
Summary • Classes implement ADTs • An object is an instance of a class • Encapsulation allows for the protection of details within the class – Public section provides interface – Protected section provides implementation • Attributes declared at the global level of the protected section may be directly accessed within any method in the protected section.
Questions?
Initializing Objects
The Scenario • You’ve defined a Queue class and now want to create an instance of that class. • There are some attributes which should be initialized when an object is created. • We’d like to initialize our Head and Tail pointers to NIL. • But the algorithm shouldn’t know about the pointers!
Need to Initialize • Our Queue class will thus need a method that “sets things up” when an object is created. • Different languages handle this differently. • We’ll use a normal method that must be invoked like any other…
“A Method By Any Other Name…” • An initialization method is just like any other method. • For clarity and convenience, we always use the identifier Initialize for such methods.
Initialize Common but Not Required • Most classes have attributes that require some initial values. • We expect most classes to have initialization methods. • But it’s not required.
Initialize In the Class Definition class Initialize_Example public. . . procedure Initialize (<parameters>) // contract information. . . protected. . . procedure Initialize (<parameters>) <implementation> endprocedure // Initialize endclass
Invoking the Initialize Method • In the algorithm, we invoke (or call) the Initialize method just as any other method. • It is assumed that Initialize is only called once, but there is no rule to enforce this. • The algorithm must explicitly call the initialize method for each object that has attributes that need to be initialize.
An Example In the algorithm: My. Queue isoftype Queue My. Queue. Initialize In the class definition: procedure Initialize head <- NIL tail <- NIL endprocedure // Initialize
Another Example In the algorithm: My. Airplane isoftype Plane My. Airplane. Initialize(“Delta 955”) In the class definition: procedure Initialize(flight_name iot in string) altitude <- 0 current_flight <- flight_name endprocedure // Initialize
Summary • Very often, objects have attributes that need some initial values. • Thus these classes need some method to set these attributes. • Different languages handle this differently: – Some have “special” methods that are automatically executed. – We’ll treat the Initialize method like any other method and call it from the algorithm for each object created.
Questions
Making Use of Classes in Algorithms
The Scenario • You need to create a simulation of an airport. • A coworker has developed an airplane class you’d like to use in your algorithm. • How do we “get at” the airplane class? • Notice we don’t have access to modify the class, just make use of it.
Importing the Class • Algorithms and class definitions often reside in separate computer files. – Recall that a benefit of Object-Oriented Programming is re-use via class libraries • We need the ability to import a class into our algorithm or another class • The “uses” clause allows this import.
The “Uses” Clause algorithm <Algorithm Name> uses <Class Name>, . . . endalgorithm // <Algorithm Name> class <Class Name> uses <Other Class Name>. . . endclass // <Class Name>
An Example Having previously defined an Airplane class, the algorithm can make use of the class and create objects of the class as follows: algorithm Airport uses Airplane Cessna, Prop isoftype Airplane. . .
A More Complex Example algorithm Big. Airport uses Airplane, Helicopter, Flight. Controller Plane 1, Plane 2 isoftype Airplane Control. Deck isoftype Flight. Controller. . . endalgorithm
Classes and Objects • A class is like a blueprint: It is analogous to data type • An object is an instantiated class (like a building): It is analogous to variable Class : Object : : Type : Variable
Creating Objects • Once the algorithm has imported the class definition, then it can create objects of the class. • Objects are created just as any variable: <Object Identifier> isoftype <Class Name> For example: My. Plane, Your. Plane isoftype Airplane Control. Deck isoftype Flight. Controller
Accessing Methods of Objects • After instantiating a class and creating an object in the algorithm, we want to make use of its methods. • There are many methods in the class, so how do we access the one we want? • Just as fields of a record, we access the methods in an object using the dot (. ) operator.
Invoking Methods of an Object algorithm Example uses My. Class My. Object isoftype My. Class My. Object. Initialize My. Object. <Any Method in Public Section>. . . endalgorithm
An Airplane Class Airplane Initialize Take. Off Change. Altitude • In. The. Air • Altitude Is. Flying Land Fly Serve. Snack
An Example of Accessing Methods algorithm Flying uses Airplane Function My. Airplane isoftype Airplane My. Airplane. Initialize if (NOT My. Airplane. Is. Flying) then My. Airplane. Take. Off My. Airplane. Change. Altitude(30000) Procedures My. Airplane. Fly(“Cincinnati”) My. Airplane. Land else print(“Sorry, that plane is already flying!”) endalgorithm
Only Access Public Methods • The algorithm cannot access protected attributes or protected methods. • The algorithm only has access to methods as declared in the public section. Examples of illegal use: My. Airplane. Altitude <- 30000 print(My. Airplane. In. The. Air) My. Airplane. Serve. Snack // method call
Summary • Import class definitions using the uses clause. • Declare objects as any other variable. • Access public methods of objects using the dot (. ) operator.
Questions?
Class Examples Airplane, Queue, Pile
Once Written, It’s Easy! Once we’ve written the class… • We test it and validate that it works • We can then make use of it in any algorithm • Notice in the following algorithm examples how little work is done – All manipulation is hidden from the algorithm – All the “details” are abstracted into the object
Airplane Example An Airplane knows how to: • Take off • Land • Fly to a destination (and serve a snack) • Change its altitude It also has the following attributes • Current altitude • Whether it’s flying or not
Airplane Symbolic Diagram Airplane Initialize Take. Off Change. Altitude • In. The. Air • Altitude Is. Flying Land Fly Serve. Snack
class Airplane public procedure Take. Off // comments here procedure Land // comments here procedure Change. Altitude (New. Height iot in Num) // comments here function Is. Fying returnsa boolean // comments here procedure Initialize // comments here procedure Fly (destination iot in String) // comments here protected // create the persistent data In. The. Air isoftype Boolean Altitude isoftype Num
// still in the protected section procedure Initialize In. The. Air <- FALSE Altitude <- 0 endprocedure // Initialize procedure Take. Off if In. The. Air then print("I'm in the air!") else In. The. Air <- TRUE Change. Altitude(3000) endif endprocedure // Take. Off
// still in the protected section procedure Change. Altitude (New. Height iot in Num) Altitude <- New. Height endprocedure // Change. Altitude procedure Fly (destination iot in String) print(“I’m flying to”, destination) Serve. Snack endprocedure // Fly procedure Serve. Snack // comments here MAKE PASSENGERS HAPPY endprocedure // Serve. Snack
// still in the protected section function Is. Flying returnsa boolean Is. Flying returns In. The. Air endfunction // Is. Flying procedure Land if In. The. Air then In. The. Air <- FALSE Change. Altitude(0) else print("I'm not in the air!") endif endprocedure // Land endclass // Airplane
Using the Airplane Class algorithm Airport uses Airplane Cessna 1090 isoftype Airplane Cessna 1090. Initialize Cessna 1090. Takeoff Cessna 1090. Change. Altitude(30000) Cessna 1090. Fly(“Baltimore”) Cessna 1090. Land endalgorithm
The Queue Dequeue A collection with restricted set of operations to change its state: only modified by adding to one end and deleting from the other. Enqueue
Number. Queue Symbolic Diagram Number. Queue Initialize Enqueue • head Dequeue • tail Is. Empty Is. Full …
class Number. Queue public procedure Enqueue(value iot in Num) // contract information here procedure Dequeue(value iot out Num) // contract - queue not empty procedure Initialize // contract information here function Is. Empty returnsa Boolean // contract information here function Is. Full returnsa Boolean // contract information here protected List_type definesa record data isoftype Num next isoftype Ptr toa List_type endrecord // create the persistent data head, tail isoftype Ptr toa List_type
// still in the protected section procedure Enqueue(value iot in Num) temp isoftype Ptr toa List_type temp <- new(List_type) temp^. data <- value temp^. next <- NIL if(Is. Empty) then head <- temp else tail^. next <- temp endif tail <- temp endprocedure // Enqueue
// still in the protected section procedure Dequeue (value iot out Num) if(Is. Empty) then // violates contract! Error! else value <- head^. data head <- head^. next if(Is. Empty) then tail <- NIL endif endprocedure // Dequeue
// still in the protected section function Is. Empty returnsa Boolean Is. Empty returns (head = NIL) endfunction // Is. Empty function Is. Full returnsa Boolean Is. Full returns FALSE // dynamic endfunction // Is. Full procedure Initialize // initialize the persistent data head <- NIL tail <- NIL endprocedure // Initialize endclass // Number. Queue
algorithm Store uses Number. Queue temp isoftype num checkout isoftype Number. Queue checkout. Initialize. . . loop some people enter and leave store randomly exitif ((no people in store) AND (closing_time)) if (someone walks up for service) then checkout. Enqueue(person’s number) endif if (NOT checkout. Is. Empty) then checkout. Dequeue(temp) print(“Now servicing person”, temp) endif endloop endalgorithm // Store
Example: Simulating the Lotto • We want to define a class that will allow us to simulate the lottery. • We want to place elements into random locations in the collection. • When we get an item from the collection, we want a random element.
A “Pile” Class • A data structure in which – Items are inserted somewhere randomly in the middle of the structure – Items are removed from a random location in the structure
Pile Symbolic Diagram Num. Pile Initialize Stick. On Dig. Out Is. Empty • Head … • num_of_things Random
class Num. Pile public procedure Stick. On (the_thing iot in Num) // purpose: put an item on the pile. // pre: none // post: the pile has the item added to it procedure Dig. Out (the_thing iot out Num) // purpose: get an item off of the pile. // pre: the pile is not empty. // post: the pile has a random element // removed. function Is. Empty returnsa boolean // comments here - contract procedure Initialize // comments here - contract
protected Pile. Node definesa Record thing isoftype Num next isoftype ptr to Pile. Node endrecord // Pile. Node head isoftype ptr toa Pile. Node num_of_things isoftype Num procedure Initialize num_of_things <- 0 head <- NIL endprocedure // Initialize function Is. Empty returnsa boolean Is. Empty returns (head = NIL) endfunction // Is. Empty
// still in the protected section function Random returnsa Num // returns a random number <= // num_of_things endfunction // Random procedure Stick. On (thing isoftype in Num) place_to_insert isoftype Num place_to_insert <- Random new_node isoftype ptr toa Pile. Node new_node <- new(Pile. Node) // loop through pile until place-to// insert is reached, then insert node num_of_things <- num_of_things + 1 endprocedure // Stick. On
// still in the protected section procedure Dig. Out (thing isoftype out Num) thing_to_snag isoftype Num place_to_get <- Random // code for looping through pile to // find right thing-to-snag, then // remove it num_of_things <- num_of_things - 1 thing <- thing_to_snag endprocedure // Dig-Out endclass // Num. Pile
Using the Pile Class algorithm Lotto uses Num. Pile lotto_pile isoftype Num. Pile lotto_pile. Initialize ticket isoftype Num loop exitif (All Entries Purchased) Get_Entry(ticket) // get input from user lotto_pile. Stick. On(ticket) endloop // Now, find one winner lotto_pile. Dig. Out(ticket) print ("The winning number is", ticket) endalgorithm // Lotto
Summary • Writing classes involves considerable work in – Design, Implementation, & Testing • But once done, algorithms may make use of the classes – Instantiating objects and manipulating them – Hiding the details and implementation – Much of the work is done inside the object
Questions?
- Slides: 82