Presentation is loading. Please wait.

Presentation is loading. Please wait.

Inheritance Horstmann ch. 6-6.6, 6.9. Inheritance: basic concepts subclass specializes super class: … extends … inheritance hierarchies overriding method.

Similar presentations


Presentation on theme: "Inheritance Horstmann ch. 6-6.6, 6.9. Inheritance: basic concepts subclass specializes super class: … extends … inheritance hierarchies overriding method."— Presentation transcript:

1 Inheritance Horstmann ch. 6-6.6, 6.9

2 Inheritance: basic concepts subclass specializes super class: … extends … inheritance hierarchies overriding method invoke super class method: super.methodname() invoke super class constructor: super(…) substitution principle overridden methods and pre/postconditions

3 Modeling specialization New method New field public class Manager extends Employee { public Manager(String aName) {...} public void setBonus(double aBonus) { bonus = aBonus; } public double getSalary() {...} private double bonus; }

4 Manager is subclass of Employee Why is Manager a subclass? Isn't a Manager superior? Doesn't a Manager object have more fields? The set of managers is a subset of the set of employees

5 Inheritance Hierarchy Real world: Hierarchies describe general/specific relationships –General concept at root of tree –More specific concepts are children Programming: Inheritance hierarchy –General superclass at root of tree –More specific subclasses are children

6 QUIZ What relation is there between Volunteers and Employees? 1.Volunteer is subtype of Employee 2.Employee is subtype of Volunteer 3.There is no sub/super relation between Employee and Volunteer 4.I don’t know Employees Volunteers

7 QUIZ Which lines result in errors? 1.none 2.A 3.B 4.A,B 5.I don’t know public class Volunteer extends Employee { private String nameCopy; public Volunteer() { nameCopy = getName(); nameCopy = name; } B A

8 The Substitution Principle You can use a subclass object whenever a superclass object is expected Example: Employee e;... System.out.println("salary=" + e.getSalary()); Can set e to Manager reference Polymorphism: Correct getSalary method is invoked

9 QUIZ Which lines result in errors? 1.none 2.a 3.b 4.c 5.a+b 6.a+c 7.b+c 8.a+b+c 9.I don’t know a) Employee e = new Volunteer(”Jørgen”)); b) e.setSalary(200); c) e.setCharity(100);

10 QUIZ What is printed? 1.1.0 and 1.0 2.1.0 and 2.0 3.2.0 and 1.0 4.2.0 and 2.0 5.I don’t know getInterest() in class Account: return getBalance() * 0.01; getInterest() in class ShareHolderAccount return getBalance() * 0.02; Application: Account ac = new ShareHolderAccount(100); ShareHolderAccount sh = (ShareHolderAccount) ac; System.out.println(ac.getinterest()); System.out.println(sh.getinterest());

11 Invoking Superclass Methods Can't access private fields of superclass public class Manager extends Employee { public double getSalary() { return salary + bonus; }... } Be careful when calling superclass method public double getSalary() { return getSalary() + bonus; } Error: salary is private Error: recursive call

12 Invoking Superclass Methods Use super keyword public double getSalary() { return super.getSalary() + bonus; } super is not a reference super turns off polymorphic call mechanism

13 Invoking Superclass Constructors Use super keyword in subclass constructor: public Manager(String aName) { super(aName); bonus = 0; } Call to super must be first statement in subclass constructor If subclass constructor doesn't call super, superclass must have constructor without parameters Calls superclass constructor: public Employee(String na) { name = na; }

14 QUIZ Which line should replace ? 1.None of a,b,c,d 2.a 3.b 4.c 5.d 6.More than one of a,b,c,d could be used 7.I don’t know public class Volunteer extends Employee { public int getSalary() { return ; } …} a) salary - charity b) super.salary – charity c) getSalary() – charity d) super.getSalary() - charity

15 Preconditions Precondition of redefined method at most as strong public class Employee { /** Sets the employee salary to a given value. @param aSalary the new salary @precondition aSalary > 0 */ public void setSalary(double aSalary) {... } } Can we redefine Manager.setSalary with precondition salary > 100000 ? No--Could be defeated: Manager m = new Manager(); Employee e = m; e.setSalary(50000);

16 Postconditions, Visibility, Exceptions Postcondition of redefined method at least as strong Example: Employee.setSalary promises not to decrease salary Then Manager.setSalary must fulfill postcondition Redefined method cannot be more private. (Common error: omit public when redefining) Redefined method cannot throw more checked exceptions

17 QUIZ Is Volunteer implementation legal? 1.yes 2.No 3.I don’t know public class Volunteer extends Employee { private void setSalary(int s) { super.setSalary(s); } public Volunteer(String name) { super(name); setSalary(0); }... }

18 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

19 Graphic Programming with Inheritance Chapter 4: Create drawings by implementing Icon interface type Now: Form subclass of JComponent public class MyComponent extends JComponent { public void paintComponent(Graphics g) { drawing instructions go here }... } Advantage: Inherit behavior from JComponent Example: Can attach mouse listener to JComponent

20 Overriding paintComponent Draw a car: public class CarComponent extends JComponent { public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; car.draw(g2); }... private CarShape car; }

21 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

22 Mouse Listeners Attach mouse listener to component Can listen to mouse events (clicks) or mouse motion events public interface MouseListener { void mouseClicked(MouseEvent event); void mousePressed(MouseEvent event); void mouseReleased(MouseEvent event); void mouseEntered(MouseEvent event); void mouseExited(MouseEvent event); } public interface MouseMotionListener { void mouseMoved(MouseEvent event); void mouseDragged(MouseEvent event); }

23 Mouse Adapters What if you just want to listen to mousePressed ? Extend MouseAdapter public class MouseAdapter implements MouseListener { public void mouseClicked(MouseEvent event) {} public void mousePressed(MouseEvent event) {} public void mouseReleased(MouseEvent event) {} public void mouseEntered(MouseEvent event) {} public void mouseExited(MouseEvent event) {} } Component constructor adds listener: addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { mouse action goes here } } );

24 Car Mover Program Use the mouse to drag a car shape Car panel has mouse + mouse motion listeners JComponent Car Component

25 mousePressed remembers point of mouse press addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { mousePoint = event.getPoint(); if (!car.contains(mousePoint)) mousePoint = null; } }); mouseDragged translates car shape addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent event) { if (mousePoint == null) return; Point lastMousePoint = mousePoint; mousePoint = event.getPoint(); double dx = mousePoint.getX() - lastMousePoint.getX(); double dy = mousePoint.getY() - lastMousePoint.getY(); car.translate( (int) dx, (int) dy ); repaint(); } });

26 QUIZ paintComponent is misspelled with small ”C” in class MyComponent. What happens? 1.Compiler error 2.Runtime error/exception 3.No error messages, but nothing is painted 4.No error messages, and component is painted as desired 5.I don’t know

27 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

28 Scene Editor Draws various shapes User can add, delete, move shapes User selects shape with mouse Selected shape is highlighted (filled in)

29 The SceneShape Interface Type keep track of selection state draw plain or selected shape move shape hit testing: is a point (e.g. mouse position) inside? public interface SceneShape { void setSelected(boolean b); boolean isSelected(); void draw(Graphics2D g2); void drawSelection(Graphics2D g2); void translate(int dx, int dy); boolean contains(Point2D aPoint); }

30 CarShape and HouseShape Classes public class CarShape implements SceneShape {... public void setSelected(boolean b) { selected = b; } public boolean isSelected() { return selected; } private boolean selected; } public class HouseShape implements SceneShape {... public void setSelected(boolean b) { selected = b; } public boolean isSelected() { return selected; } private boolean selected; }

31 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

32 Abstract Classes Factor out common behavior ( setSelected, isSelected ) Subclasses inherit common behavior Some methods still undefined ( draw, drawSelection, translate, contains ) public abstract class SelectableShape implements SceneShape { public void setSelected(boolean b) { selected = b; } public boolean isSelected() { return selected; } private boolean selected; }

33 HouseShape and CarShape are concrete Can't instantiate abstract class: SelectableShape s = new SelectableShape(); // NO Ok to have variables of abstract class type: SelectableShape s = new HouseShape(); // OK

34 Abstract Classes and Interface Types Abstract classes can have fields Interface types can only have constants ( public static final ) Abstract classes can define methods Interface types can only declare methods A class can implement any number of interface types In Java, a class can extend only one other class

35 QUIZ Are implementations of SavingsAccount and Account legal? 1.yes 2.no 3.Maybe – depends on context 4.I don’t know public abstract class Account { private int balance; public abstract void deductFee(); public int getInterest() { return 0; } } public class SavingsAccount extends Account { public void deductFee() {} }

36 Scene Editor Mouse listener selects/unselects item addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { mousePoint = event.getPoint(); for (SceneShape s : shapes) { if (s.contains(mousePoint)) s.setSelected(!s.isSelected()); } repaint(); } );

37 Scene Editor Mouse motion listener drags selected items addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent event) { Point lastMousePoint = mousePoint; mousePoint = event.getPoint(); for (SceneShape s : shapes) if (s.isSelected()) { double dx = mousePoint.getX() - lastMousePoint.getX(); double dy = mousePoint.getY() - lastMousePoint.getY(); s.translate((int)dx,(int)dy); } repaint(); } } );

38 Scene Editor Remove button removes selected items removeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { scene.removeSelected(); } );

39 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

40 Uniform Highlighting Technique

41 public void drawSelection(Graphics2D g2) { translate(1, 1); draw(g2); translate(1, 1); draw(g2); translate(-2, -2) } drawSelection calls draw draw not implemented yet! Declare as abstract method public abstract void draw(Graphics2D g2); Defined in CarShape, HouseShape drawSelection method calls draw, translate drawSelection doesn't know which methods -- polymorphism drawSelection is a template method

42 TEMPLATE METHOD Pattern Context An algorithm is applicable for multiple types. The algorithm can be broken down into primitive operations. The primitive operations can be different for each type The order of the primitive operations doesn't depend on the type Solution Define a superclass that has a method for the algorithm and abstract methods for the primitive operations. Implement the algorithm to call the primitive operations in the appropriate order. Do not define the primitive operations in the superclass, or define them to have appropriate default behavior. Each subclass defines the primitive operations but not the algorithm.

43 TEMPLATE METHOD Pattern

44 drawSelection() draw() translate() SelectableShape draw() translate() CarShape EXAMPLE

45 QUIZ Which exemplifies Template Method pattern? Instance variable in class Client: Board b; Method playGame in class Client: b.init(); while (!b.done()) b.move(); a)Method playGame in class Game: init(); while (!done()) move(); b) 1.None 2.a 3.b 4.a+b 5.I don’t know

46 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

47 Compound Shapes House = rectangle + triangle Car = rectangle + circles + lines CompoundShape uses GeneralPath java.awt.geom.GeneralPath : sequence of shapes GeneralPath path = new GeneralPath(); path.append(new Rectangle(...), false); path.append(new Triangle(...), false); g2.draw(path); Advantage: Containment test is free path.contains(aPoint);

48 Access to Superclass Features Why does the HouseShape constructor call add? public HouseShape() { add(new Rectangle(...)); add(new Triangle(...)); } Why not just path.append(new Rectangle(...)); HouseShape inherits path field HouseShape can't access path path is private to superclass

49 Protected Access Make CompoundShape.add method protected Protects HouseShape : other classes can't add graffiti Protected features can be accessed by subclass methods......and by methods in the same package Bad idea to make fields protected protected GeneralPath path; // DON'T Ok to make methods protected protected void add(Shape s) // GOOD Protected interface separate from public interface

50 QUIZ Should this structure be refactored? 1.Yes, implement listCourses in common superclass 2.Yes, define abstract method listCourses in common superclass 3.No, keep as it is 4.Depends … 5.I don’t know

51 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

52 Hierarchy of Swing Components

53 Hierarchy of Geometrical Shapes

54 Hierarchy of Exception Classes

55 Inheritance: Examples Graphics programming Mouse(Motion)Listener Refactoring Abstract class Template Pattern Protected access Class hierarchy examples When not to use inheritance

56 When Not to Use Inheritance public class Point { public Point(int anX, int aY) {... } public void translate(int dx, int dy) {... } private int x; private int y; } public class Circle extends Point { // DON'T public Circle(Point center, int radius) {... } public void draw(Graphics g) {... } private int radius; } A circle isn't a point By accident, inherited translate works for circles

57 When Not to Use Inheritance public class Rectangle extends Point { // DON'T public Rectangle(Point corner1, Point corner2) {... } public void draw(Graphics g) {... } public void translate(int dx, int dy) {... } private Point other; } That's even weirder: public void translate(int dx, int dy) { super.translate(dx, dy); other.translate(dx, dy); } Remedy: Use aggregation. Circle, Rectangle classes have points

58 Stack: examples Plates in a cafeteria "last hired, first fired" Stack of changes in text editor. "undo" reverts topmost change Stack of URL's in web browser. Back button returns to topmost URL on stack. Stack of books

59 Stack a stack consists of some objects placed on top of each other (ordered) a new object may be placed on top of those already in the stack the topmost object may be removed from the stack LIFO = Last In First Out

60 Stack java.util.Stack is concrete implementation of a stack most important operations: boolean empty() E peek() E pop() E push(E item) peeks returns topmost element without removing it

61 When Not to Use Inheritance Java standard library: public class Stack extends Vector { // DON'T T pop() {... } T push(T item) {... }... } Bad idea: Inherit all Vector methods Can insert/remove in the middle of the stack Remedy: Use aggregation public class Stack {... private ArrayList elements; }

62 QUIZ Which UML figure is most appropriate? 1.a 2.b 3.c 4.d 5.I don’t know a) b) d) c) Queue


Download ppt "Inheritance Horstmann ch. 6-6.6, 6.9. Inheritance: basic concepts subclass specializes super class: … extends … inheritance hierarchies overriding method."

Similar presentations


Ads by Google