Object Oriented Design and UML Class Relationships Dependency

Object Oriented Design and UML • Class Relationships – Dependency – Aggregation – Interfaces – Inheritance (not today) • Interfaces • Reading for this Lecture: L&L 7. 4 – 7. 5 1

Class Relationships • Classes in a software system can have various types of relationships to each other • Three of the most common relationships: – – Dependency: A uses B Aggregation: A has-a B (as in B is an integral part of A) Interface: A is B (adjective) or A is-a B (noun) Inheritance: A is-a B • We cover the first three now • We cover inheritance later 2

Dependency • A dependency exists when one class relies on another in some way, usually by invoking the methods of the other • We've seen dependencies in previous examples and in Projects 1 and 2 • We don't want numerous or complex dependencies among classes • Nor do we want complex classes that don't depend on others • A good design strikes the right balance 3

Project 2 UML Diagram Die Dice. Stats - MIN_ROLL : int - MAX_LENGTH : int + main(args : String [ ]) : void - MAX : int - face. Value : int + Die() + roll() : int + set. Face. Value(value : int) : void + get. Face. Value( ) : int + to. String() : String Histogram - values : int [ ] - min. Index : int - max. Length : int + Histogram (values : int [ ], min. Index : int, max. Length : int) + draw. Hor(void) : void + draw. Ver(void) : void

Aggregation • An aggregate is an object that is made up of other objects • Therefore aggregation is a has-a relationship – A Student has (a) Address object(s) (pg. 321) • In code, an aggregate object contains references to its component objects as instance data • - Student has 2 Address refs: private Address home. Address, school. Address; • The aggregate object itself is defined in part by the objects that make it up: these Addresses are important state for Student 5

Aggregation • In the text’s example, a Student object has two Address objects, so Student is an “aggregate” • See Student. java, Address. java (page 318 -319) • An aggregation association is shown in a UML class diagram using an open diamond at the aggregate end, here the Student end vs. • Note there is no arrow point on this connector, but many UML authors do use one 6
![Dependency/Aggregation in UML Student. Body + main (args : String[]) : void Student - Dependency/Aggregation in UML Student. Body + main (args : String[]) : void Student -](http://slidetodoc.com/presentation_image_h/0697246eef725f8a8c80581eaa256037/image-7.jpg)
Dependency/Aggregation in UML Student. Body + main (args : String[]) : void Student - first. Name : String last. Name : String home. Address : Address school. Address : Address + to. String() : String Aggregation shown with this symbol Dependency shown with this symbol Address - street. Address : String city : String state : String zip. Code : long + to. String() : String 7

Aggregation • There are two ways to include the component objects in an object that is an aggregation – For a small constant number of components, can use parameters in the constructor public Car(Car. Part chassis, Car. Part engine) {. . . } – For a large or indefinite number of components, define an add method to add them one at a time: adding students to a Section: public void add(Student a. Student) {. . . } 8

Interfaces • A Java interface is a collection of constants and method headers with a name that looks like a class name, i. e. the first letter is capitalized • An interface is used to identify a set of methods that a class will implement • The class can have other methods too • Example later: • class Lion implements interface Predator • Methods Lion needs to implement: chase. Prey, eat. Prey, the predator-related actions • Lion can also have a purr() method 9

Interfaces interface is a reserved word None of the methods in an interface are given a definition {body} public interface Doable { // Doable constants public static final boolean DONE = true; public static final boolean NOT_DONE = false; // Doable required methods (signatures only) public void do. This(); public int do. That(); } A semicolon immediately follows each method header 10

Interfaces, without “public”, “static” or “final” except on whole thing public interface Doable { // Doable constants: // automatically public static final boolean DONE = true; boolean NOT_DONE = false; // Doable required methods // automatically public void do. This(); int do. That(); } 11

Interfaces • An interface name can be either an adjective (like …able) or a noun (like a class name) • An interface cannot be instantiated by itself • A class implements an interface by: – using the Java reserved word implements – providing an implementation for each abstract method that is defined in the interface • Classes that implement an interface can also implement their own methods and they usually do 12

Interfaces public class Worker implements Doable { Doable is an adjective public void do. This () { // whatever } public int do. That () { // whatever } implements is a reserved word Each method listed in Doable must be given a definition, and here “public” IS NEEDED!! // etc. } 13

Interfaces In UML <<interface>> Doable + DONE : boolean + NOT_DONE : boolean + do. This( ) : void + do. That( ) : int Interface box looks like a class box with stereotype <<interface>> A “Generalization” arrow is used for “implements” (and also for “extends” later) Worker + do. This( ) : void + do. That( ) : int + do. Nothing ( ) : void + do. Something ( ) : void Each method listed in Doable becomes a method of Worker can have other methods of its own 14

Interfaces • A class can implement multiple interfaces • All interface names are listed in the implements clause • The class must implement all methods in all interfaces listed in the header class Many. Things implements Interface 1, Interface 2, . . . { // all methods of all interfaces } 15

Example from Wikipedia Idea: a Predator must be able to chase and eat prey public interface Predator { boolean chase. Prey(Prey p); void eat. Prey(Prey p); } public class Lion implements Predator { public boolean chase. Prey(Prey p) { // programming to chase prey p (spec. for a lion) } public void eat. Prey (Prey p) { // programming to eat prey p (spec. for a lion) } // other Lion methods public void purr(); } 16

Predator Interface In UML <<interface>> Predator + chase. Prey(Prey p) : void + eat. Prey(Prey p) : void Interface box looks like a class box with stereotype <<interface>> A “Generalization” arrow is used for “implements” (and also for “extends” later) Lion + chase. Prey(Prey p) : void + eat. Prey(Prey p) : void + purr( ) : void Each method listed in Predator becomes a method of Lion can have other methods of its own 17

Example from Wikipedia Here Prey can itself be an interface, expressing Prey actions, say flee(Predator p) And a class can implement multiple interfaces, public class Frog implements Predator, Prey {. . . } This class will need to have methods chase. Prey, eat. Prey, and flee, and can have more methods of its own 18

Interface Types • You can go from Lion to Predator type: Lion leo = new Lion(…); // Lion object Predator p = leo; // Predator ref to Lion • Now have useful Predator object ref • You can pass an object of Lion class to a method as an object of Predator type. Frog freddie = new Frog(…); freddie. flee(leo); leo. chase. Prey(freddie); //also works • We say a Lion IS-A Predator, a Frog IS-A Prey, and also a Frog IS-A Predator 19

Interface. Types • When you are using an object via an interface ref, you can only call the interface methods with it • Lion-specific methods, such as purr(), are not accessible when a Lion object is being used as a Predator object because they are not defined in the interface Lion leo = new Lion(…); // Lion object Predator p = leo; // Predator ref to Lion leo. purr(); // works fine: Lions can purr() p. purr(); // doesn’t work!! Predators can’t purr() ((Lion)p). purr(); // cast to Lion—works (the object is really a Lion, after all) 20

Library Interfaces • The Java standard class library contains many interface definitions that allow other classes to treat your new class as if it were that interface • Note: Comparable is an adjective in this case • The Comparable interface contains one abstract method called compare. To, which can compare an object with another object of the same type • We discussed the compare. To method of the String class previously • The String class implements Comparable, giving us the ability to put strings in lexicographic order 21

The Comparable Interface • Any class can implement Comparable to provide a mechanism for comparing objects of that type by providing a compare. To method if (obj 1. compare. To(obj 2) < 0) System. out. println ("obj 1 is ” + “less than obj 2"); • The value returned from compare. To should be negative if obj 1 is less than obj 2, 0 if they are equal, and positive if obj 1 is greater than obj 2 • When you design a class that implements the Comparable interface, it should follow this intent 22

The Comparable Interface • It's up to you as the programmer to determine what makes one object less than another • For example, you may define the compare. To method of an Lion class to order by weight or tooth-length or any other useful way • The implementation of the method can be as straightforward or as complex as needed for the situation • Then we can sort an array of Lions, for example 23
- Slides: 23