9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01,...

56
03/30/22 CPSC-4360-01, CPSC-5360-01, Lecture 10 1 Software Engineering, CPSC-4360-01, CPSC-5360- 01, Lecture 10

Transcript of 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01,...

Page 1: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 1

Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10  

Page 2: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 2

Review of Last Lecture Basic Implementation Steps. Implementing Classes:

Class Association: Navigation direction; Multiplicity constraint; Qualified associations; Association classes.

Page 3: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 3

Overview of This Lecture

Implementing a Statechart Review of Java programming concepts:

Inheritance Polymorphism Type Casting Interface

Page 4: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 4

Where are we now?

Requirement

Analysis

Design

Implement

Test

Translate Statechart into Code

Page 5: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 5

Implementing Statecharts

If a statechart for a class exists: it gives an overall specification of the class

behaviour. it can be used to structure the implementation of the

operations in a systematic way. Example: Account class

States: InCredit, OverDrawn, Suspended. Operations: deposit, withdraw, suspend, unsuspend.

Page 6: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 6

A Statechart for Account

statechart

deposit [amt < -bal]/bal += amt

amt is a positive number (precondition).

Page 7: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 7

Implementation Steps

1. Define States: enumerate different states as constants.

2. Record an object’s current state: initial state specifies what state the object is in

when it is created. implement this in the constructor.

3. For each operation, implement state-dependent behaviour using a switch statement:

one case for each state. code state-specific actions.

Page 8: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 8

Implementation: Step 1 and 2public class Account { private final int InCredit = 0; private final int OverDrawn = 1; private final int Suspended = 2; private int historyState; private int state; ... ... public Account() { state = InCredit; }}

Step 1: • Define States.

Step 2:• Implements Initial State in constructor.

The recommendation is to use the State pattern, but for simplicity we use instead integer constants to identify the states.

Page 9: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 9

Implementation: Step 3

withdraw[amt > bal] /bal-=amt

withdraw[amt <=

bal] / bal-=amt

InCredit

Overdrawn

Statechart (partial)

public void withdraw(double amt) {switch (State) { case InCredit:

if (amt > bal) { state = Overdrawn; }

bal -= amt;break;

case Overdrawn:case Suspended:

break; }}

Page 10: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 10

Composite States The “suspend” transition leading from the

composite state is shared by all substates. Group all substates as a single case.

public void suspend () { switch (state) { case InCredit: case Overdrawn: state = Suspended; break; case Suspended: break;}

Group all substates as one

case.

Page 11: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 11

History State

public void unsuspend() {

switch (state) {

case Suspended:

state = historyState;

break;

// other cases

}

}

public void suspend() { switch (state) { case InCredit: historyState = state; state = Suspended; break; // other cases

}}

Current state to be stored when leaving the composite state.

Last state to be reinstated when unsuspend is triggered.

Page 12: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 12

Entry and Exit Actions Entry Action:

The code for an entry action should be executed whenever an object enters the state containing the action.

Exit Action: The code for an exit action should be executed

whenever that state is left. Example:

Suppose state S has: entry and exit actions defined for it, and events eventF and eventG cause transitions to and from S,

respectively.

Page 13: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 13

Entry/Exit Action: Implementation

entry /actionexit /action

S

eventF

eventG

public void eventF() { switch (state) { case S: break ; case T: doEntry() ; state = S ; break ; } }

public void eventG() { switch (state) { case S: doExit() ; state = U ; break ; case U: break ; } }

For eventF(), the state T is the state that enters S; and for eventG(), the state S goes to state U.

Page 14: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 14

Review of Java Concepts

Page 15: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 15

Overview of Topics

Intuitive and practical meaning of inheritance. Syntax for inheritance. Method overloading and overriding. Polymorphic assignments and substitution. Interfaces.

Page 16: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 16

Abstract Idea of Inheritance

Specialization

Generalization

Page 17: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 17

“Is-A” versus “Has-A” The “Is-A” rule of thumb:

If “An A is-a B” sounds right, then A is likely to be a subclass of B.

Example: “Dog is-a mammal”: Hence, a Dog can inherit

from a Mammal.

The “Has-A” rule of thumb: If “An A has-a B” seems right, then A and B

should be separate classes, but related by an association.

Example: “A car has-an engine”: A Car has an

association to an Engine.

A

B

A B

Dog

Mammal

Car Engine

Page 18: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 18

Motivations for Inheritance Reuse of code:

Methods defined in the parent class can be made available to the child class without rewriting. Makes it easy to create new abstractions.

Example: Stack inherits from a Vector.

Reuse of concept: Methods described in the parent can be redefined

and overridden in the child. The concept embodied in the definition is shared.

Example: Circle inherits from a Shape.

Page 19: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 19

Class Inheritance in Java

When a class A inherits from (or extends) class B, class A is called a subclass or an extended class of B and B is the superclass of A.

All public and protected members of the superclass are accessible in the extended class.

The subclass inherits features from its superclass, and may add more features.

A subclass extends the capability of its superclass.

Page 20: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 20

Extending Classes in Java

A subclass is a specialization of its superclass.

Every instance of a subclass is an instance of a superclass, but not vice-versa. Substitution:

An instance of a subtype can be substituted for an instance of its supertype.

Side issue: subtype versus subclass.

Page 21: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 21

Type Signature for a Method A sequence that consists of types of method’s

parameters. The returned type and parameter names are not part

of the type signature. Parameter order is significant.

Method Type Signature

int Add(int X, int Y) (int, int)

void Add(int A, int B) (int, int)

void m(int X, double Y) (int, double)

void m(double X, int X) (double, int)

Page 22: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 22

Java Terminology interface I extends J { }

I and J contain signatures only, no implementations I is a subtype of J

class A implements I { } objects of class A satisfy interface I A is an implementation of I

class A extends B { } objects of class A reuse the implementation of B A is a subclass of B type of A is also a subtype of type of B

abstract class C { } C has unimplemented signatures

Page 23: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 23

Differences between Subclassing and Subtyping A is a subclass of B:

Every A object has a B object inside of it. A is a Java subtype of B:

a variable of type B may refer to a variable of type A. Subclassing implies subtyping:

If an object A has an object B inside, then a variable of type B may refer to a variable of type A.

Subtyping does not necessarily imply subclassing: We can have a variable of interface B that refers to a variable

of interface A (assuming that interface A extends interface B).

Page 24: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 24

Class Hierarchies

There are two common views of class hierarchies: All classes are part of a single large class hierarchy. Thus,

there is one class that is the original ancestor of all other classes. (Java)

Classes are only placed in hierarchies if they have a relationship - results in many small hierarchies, but no single ancestor. (C++)

Page 25: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 25

Java Class Hierarchy

Page 26: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 26

Method Overloading Two methods in a class

with the same name but different signatures are known as method overloading.

Overloading is resolved at compile time: the number and the types of

the arguments are used to determine the signature of the method that will be invoked.

public class Account { Account () { //Signature: ( ) ... }

Account (String name, String number, double balance) { //Signature: //(String,String,double) } ...}

Page 27: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 27

Method Overriding Overriding refers to the

presence of an instance method in a subclass that has the same name, type signature and returned type of a method in the superclass.

The implementation of the method in the subclass replaces the implementation of the method in the superclass.

public class A { M(int X, int Y) { //Signature: //(int, int) ... }}

public class B extends A { M(int X, int Y) { //Signature: //(int, int) ... }}

Page 28: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 28

Code Examplepublic class Employee { private String name; private double salary; public void raiseSalary(double byPercent) { salary = salary + (salary * byPercent / 100); } // other methods}

public class Manager extends Employee { public void raiseSalary(double byPercent) { double bonus = 200; super.raiseSalary(byPercent + bonus); } // other methods}

Page 29: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 29

Code Example (cont)

public class Test { static public void main(String args[]) { Employee e = new Employee (“Mary", 1000); e.raiseSalary(10); // Mary’s Salary = ?

Manager m = new Manager ("John", 1000); m.raiseSalary(10); // John’s Salary = ? } }

Questions:•What happens in the absence of method raiseSalary() in Manager?•Is Employee m = new Manager(“Smith”, 1000); a valid assignment?•What if raiseSalary() is a static method in Employee class?•Does Manager redefine name and salary?

Page 30: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 30

Polymorphic Assignments The type of the expression at the RHS of an

assignment must be the same or a subtype of the type of the variable at the LHS of the assignment.

Employee e = new Employee(); Employee m = new Manager(); If class A extends class B, any instance of A can act as

an instance of B: B bObject = new A(); // polymorphic assignment Question: If A extends B, and B extends C; does A

extends C? C cObject = new A(); // valid ?

Page 31: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 31

Code Exampleclass Student { protected String name; public Student(String name) {this.name = name;} public String toString() { return "Student: " + name;}}

class Undergraduate extends Student {public Undergraduate(String name) {super(name);}public String toString() { return "Undergraduate student: " + name;}

}

class Graduate extends Student {public Graduate(String name) {super(name);}public String toString() { return "Graduate student: “ + name;}

}

Page 32: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 32

Polymorphic Method Invocation Instance method toString() is overridden in both

subclasses:Student s = new Undergraduate();

s.toString(); // output = ? The implementation to be invoked depends on the

actual class of the object referenced by the variable at run-time (and not the declared type of the variable).

This is called polymorphic method invocation (or dynamic binding).

Page 33: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 33

Polymorphic Method Invocation Steps in resolving method call

variable.method(…) At Compile Time:

TS = Type Signature of method(). Fixed at compile time. At Run Time:

STEP 1

class = the class of the object referenced by variable STEP 2:

if (method() with TS is implemented in class) then

the implementation of method() in class is invoked.else class = the superclass of class repeat step 2

Page 34: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 34

Validity of a Method Invocation Assume that the Graduate class defines a method

getResearchTopic() that is not defined in the Student class:

Student s = new Graduate();

s.getResearchTopic(); // anything wrong?

The declared type of s is Student, not Graduate, even though s holds an instance of Graduate.

The validity of method invocation is checked statically (at compile time) and it is based on the declared types of variables, not the actual classes of objects.

Page 35: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 35

Type Casting

The last assignment failed compilation as the LHS is not a subtype of RHS.

At compile time, the type is checked using the declared type.

Student s1, s2;

s1 = new Undergraduate(); // polymorphic assignments2 = new Graduate(); // polymorphic assignment

Graduate gs;gs = s2; // anything wrong?

Page 36: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 36

Type Casting (cont) An explicit cast is necessary here:

gs = (Graduate) s2; // downcasting

Two types of Type Casting: Downcasting (Narrowing): Conversion of a

supertype to one of its subtypes. Narrowing of reference types requires explicit casts.

Upcasting (Widening): Conversion of a subtype to one of its supertypes. A reference to an object of class X can be implicitly

converted to a reference to an object of one of the superclasses of X whenever necessary.

Page 37: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 37

Type Casting: Compile Time Check Type casting syntax:

(type) variable

Simple rule is used during compilation: If the class of variable is either an ancestor class or a

subclass of type, then it is valid. Simpler way to remember: as long as you can trace a

straight line from the class of variable to the type in the class hierarchy, then it is valid.

Type cast is checked from the innermost level:(typecastB) (typecastA) variable

First Check

Second Check

Page 38: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 38

Type Casting: Compile Time Check Are the following valid during compilation given the

class diagram?

A

B C

D

Class Diagram

A a = new A( ); B b = new B( ); C c = new C( ); D d = new D( );

(D)a; //valid? (A)d; //valid? (C)d; //valid? (C)(A)d; //valid? (D)(A)(C)(A)b; //valid? (B)(C)(A)d; //valid? (A)(B)d; //valid?

Page 39: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 39

Type Casting: Runtime Checkgs = (Graduate) s2; // compilation ok

Validity of explicit cast is checked at run-time. Run-time check will be performed to determine whether s2

actually holds an object that is an instance of Graduate or its subclasses.

gs = (Graduate) s1; // compilation ok

The statement will throw a run-time exception as s1 actually holds an instance of Undergraduate (which is not a subtype of Graduate).

Page 40: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 40

Interfaces

interface MyInterface { // an abstract method void aMethod(int i);}

class MyClass implements MyInterface { public void aMethod(int i){ ... }}

<<Interface>>MyInterface

aMethod(i: int)

MyClass

aMethod(i: int)

Page 41: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 41

Interfaces An interface encapsulates abstract methods and

constants. Interfaces provides no implementation. Interface methods cannot be static (an interface

accepts static attributes/data – example slide 50). An interface can extend other interfaces. Classes that implement an interface should provide

implementation for all methods declared in the interface.

Java allows only single inheritance for class extension, and multiple inheritance for interface extension.

Page 42: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 42

Code Example (Single Interface)interface myIface {

void myMethod(int param);}

class Client implements myIface {void myMethod(int p) { System.out.println( “method called with” + p);}

}

class TestIface {public static void main(String args[]) { myIface c = new Client(); c.myMethod(42);}

}

<<Interface>>myIface

Client

Page 43: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 43

Interfaces (cont) You can declare variables as object references

which use an interface as the type rather than a class.

Any instance of any class which implements the declared interface may be stored in such a variable: Variable c was declared to be of interface myIface, yet

it was assigned an instance of Client. This way, c can only be used to access the

myMethod(), and not any of the other methods of the Client class that do not belong to interface myIface.

Page 44: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 44

Code Example (Multiple Interfaces)

interface Student {

float getGPA(); // …other methods

}

interface Employee {

float getSalary(); // … other methods

}

public class FullTimeStudent implements Student

{ protected float gpa; public float getGPA() { // calculate GPA; } // ...}

public class FullTimeEmployee implements Employee

{ protected float salary; public float getSalary() { // calculate salary; } // ...}

Page 45: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 45

Code Example (Multiple Interfaces)public class StudentEmployee

implements Student, Employee { protected float gpa; protected float salary; public float getGPA() { // calculate GPA; } public float getSalary() { // calculate salary; } // ..other methods and fields}

The StudentEmployee class is a subtype of both Student and Employee.

Instances of StudentEmployee can be treated either as Students as well as Employees.

Implementing Multiple

Interfaces.

Page 46: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 46

Implementing Multiple InheritanceStudent[] students = new StudentEmployee[…];students[0] = new FullTimeStudent();students[1] = new StudentEmployee(); // student employee as a student// ...for (int i = 0; i < students.length; i++) { .. students[i].getGPA()...}

Employee[] employees = new StudentEmployee[…];employees[0] = new FullTimeEmployee();employees[1] = new StudentEmployee(); // student employee as an employee// ...for (int i = 0; i < employees.length; i++) { .. employees[i].getSalary()...}

Viewed as an Employee in this context.

Viewed as a Student in this

context.

Page 47: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 47

Name Conflicts

When implementing multiple interfaces, name conflicts represent a common problem: Two or more of the interfaces define methods with

same name. Example:

interface X {

void method1(int i); void method2(int i); void method3(int i);

}

interface Y {

void method1(double d); void method2(int i); int method3(int i);

}

Page 48: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 48

Resolving Name Conflicts Rules for resolving name conflicts: Methods with different Type Signature:

Example: method1() Overloaded: Both versions must be implemented.

Methods with similar Type Signature, and the same returned type: Example: method2() Considered as a single method. Only one implementation is

required. Methods with similar Type Signature but different

returned type: Example: method3() Compilation Error.

Page 49: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 49

Constants in Interfaces Unlike a UML interface, a Java interface allows

definition of constants other than method headers. Similar problem when implementing two interfaces

with constant(s) of the same name.

interface X { static int a = 1;}

interface Y { static double a = 2.0;}

public class MyClass implements X, Y {

void aMethod() {// How to access a in X?// How to access a in Y?}

}

Page 50: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

Interface: Exampleinterface X {

static int a = 1;

void myMethod();

}

class Client implements X {

public void myMethod() {

System.out.println("X.a = " + X.a);

}

}

public class TestInterface {

public static void main(String args[]) {

X c = new Client();

c.myMethod();

}

}

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 50

Page 51: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

Interface: Example - cont

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 51

Page 52: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 52

Where are we now?

Requirement

Analysis

Design

Implement

Test

Executable ready for validation and verification.

Page 53: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 53

Summary

Implementing a Statechart Review of Java programming concepts

Inheritance Polymorphism Type Casting Interface

Page 54: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 54

Reading Suggestions

Chapter 13 of [Priestley; 2004] Chapter 8 of [Bimlesh, Andrei, Soo; 2007] Chapters 8 and 12 of [Budd; 2000] -

“Understanding Object-Oriented Programming with Java (Updated Edition)”, Addison-Wesley

Chapters 6 and 7 of [Eckel; 2000] - “Thinking in Java “, 3rd Ed, http://www.mindview.net/Books

Page 55: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 55

Coming up next

Chapter 9 of [Bimlesh, Andrei, Soo; 2007] Chapter 23 of [Somerville; 2007] - Testing Chapter 9 of [Pfleeger, Atlee; 2006]

Page 56: 9/10/2015CPSC-4360-01, CPSC-5360-01, Lecture 101 Software Engineering, CPSC-4360-01, CPSC-5360-01, Lecture 10.

04/19/23CPSC-4360-01, CPSC-5360-01,

Lecture 10 56

Thank you for your attention!

Questions?