ITEC324 Principle of CS III Chapter 6 (Horstmann’s Book) Inheritance :Adapter Class, Abstract Class Hwajung Lee
Inheritance Hierarchies Modeling Specialization and Generalization 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 When designing systems, look for instances of generalization and specialization
Example Hierarchy of Employee Classes
The Substitution Principle (1) Formulated by Barbara Liskov You can use a subclass object whenever a superclass object is expected example: Employee e; e = new Manager(“Barnie Smith”); ... System.out.println("salary=" + e.getSalary()); Can set e to Manager reference Polymorphism: Correct getSalary method is invoked
The Substitution Principle (2) In Java, the type rules always allow a subclass object to be used when a superclass object is expected. However, the question is whether the subclass object can replace the superclass one, conceptually! Don't use inheritance if substitution principle is violated
Invoking Superclass Constructors Use super keyword in subclass constructor: public Manager(String aName) { super(aName); // calls superclass constructor bonus = 0; } Call to super must be first statement in subclass constructor If a subclass constructor does not call a superclass constructor, then the superclass constructor with no parameters is called automatically.
Hierarchy of Swing Components (1) Base of hierarchy: Component Most important subclass: Container
Hierarchy of Swing Components (2)
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
Graphic Programming with Inheritance Overriding paintComponent (1) Draw a car: public class CarComponent extends JComponent { public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; car.draw(g2); } ... private CarShape car; }
Mouse Listeners To Complete the car drawing program (1) 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); }
Mouse Listeners To Complete the car drawing program (2) public interface MouseMotionListener { void mouseMoved(MouseEvent event); void mouseDragged(MouseEvent event); }
Mouse Adapter To Complete the car drawing program (3) What if you just want to listen to mousePressed? Listener interface types with many methods have corresponding adapter classes with do-nothing methods. Extend the adapter rather than implementing the listener.
Mouse Adapter To Complete the car drawing program (4) 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) {} }
Mouse Adapter To Complete the car drawing program (5) Extend MouseAdapter Component constructor adds listener: addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { mouse action goes here } });
Car Drawing Program ch6/car/CarShape.java ch6/car/CarComponent.java ch6/car/CarMover.java
Abstract Classes (1) An abstract method is undefined and must be defined in a subclass. A class with one or more abstract class methods must be declared as an abstract class. public abstract class SelectableShape implements SceneShape { … }
Abstract Classes (2) You can not construct an object of an abstract class. SelectableShape shape = new SelectableShape(); //Error SelectableShape shape = new HouseShape(); //OK
Abstract Classes (3) SceneShape.java SelectableShape.java HouseShape.java CarShape.java ScenePanel.java SceneEditor.java