Improving structure with inheritance 5 0 Main concepts










































- Slides: 42

Improving structure with inheritance 5. 0

Main concepts to be covered • • Inheritance Subtyping Substitution Polymorphic variables Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 2

The Network example • A small, prototype social network. • Supports a news feed with posts. • Stores text posts and photo posts. – Message. Post: multi-line text message. – Photo. Post: photo and caption. • Allows operations on the posts: – E. g. , search, display and remove. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 3

Network objects Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 4

Network classes Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 5

Network object model Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 6

Class diagram Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 7

Message. Post source code public class Message. Post { private String username; private String message; private long timestamp; private int likes; private Array. List<String> comments; public Message. Post(String author, String text) { username = author; message = text; timestamp = System. current. Time. Millis(); likes = 0; comments = new Array. List<String>(); } Just an outline public void add. Comment(String text). . . public void like(). . . public void display(). . . } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 8

Photo. Post source code public class Photo. Post { private String username; private String filename; private String caption; private long timestamp; private int likes; private Array. List<String> comments; public Photo. Post(String author, String filename, String caption) { username = author; this. filename = filename; this. caption = caption; timestamp = System. current. Time. Millis(); likes = 0; comments = new Array. List<String>(); } Just an outline public void add. Comment(String text). . . public void like() … public void display() …. . . } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 9

News. Feed public class News. Feed { private Array. List<Message. Post> messages; private Array. List<Photo. Post> photos; . . . public void show() { for(Message. Post message : messages) { message. display(); System. out. println(); // empty line between posts } for(Photo. Post photo : photos) { photo. display(); System. out. println(); // empty line between posts } } } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 10

Critique of Network • Code duplication: – Message. Post and Photo. Post classes very similar (large parts are identical) – makes maintenance difficult/more work – introduces danger of bugs through incorrect maintenance • Code duplication in News. Feed class as well. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 11

Using inheritance Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 12

Using inheritance • define one superclass : Post • define subclasses for Message. Post and Photo. Post • the superclass defines common attributes (via fields) • the subclasses inherit the superclass attributes • the subclasses add other attributes Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 13

Inheritance hierarchies Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 14

Inheritance in Java public class Post {. . . } no change here public class Photo. Post extends Post {. . . } public class Message. Post extends Post {. . . } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 15

Superclass public class Post { private String username; private long timestamp; private int likes; private Array. List<String> comments; // constructor and methods omitted. } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 16

Subclasses public class Message. Post extends Post { private String message; // constructor and methods omitted. } public class Photo. Post extends Post { private String filename; private String caption; // constructor and methods omitted. } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 17

Inheritance and public class Post { constructors private String username; private long timestamp; private int likes; private Array. List<String> comments; /** * Initialise the fields of the post. */ public Post(String author) { username = author; timestamp = System. current. Time. Millis(); likes = 0; comments = new Array. List<String>(); } // methods omitted } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 18

Inheritance and constructors public class Message. Post extends Post { private String message; /** * Constructor for objects of class Message. Post */ public CD(String author, String text) { super(author); message = text; } // methods omitted } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 19

Superclass constructor call • Subclass constructors must always contain a 'super' call. • If none is written, the compiler inserts one (without parameters) – works only, if the superclass has a constructor without parameters • Must be the first statement in the subclass constructor. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 20

Adding more item types Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 21

Deeper hierarchies Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 22

Review (so far) Inheritance (so far) helps with: • Avoiding code duplication • Code reuse • Easier maintenance • Extendibility Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 23

public class News. Feed { private Array. List<Post> posts; /** * Construct an empty news feed. */ public News. Feed() { posts = new Array. List<Post>(); } /** * Add a post to the news feed. */ public void add. Post(Post post) { posts. add(post); }. . . Revised News. Feed source code avoids code duplication in the client class! } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 24

New News. Feed source code /** * Show the news feed. Currently: print the * news feed details to the terminal. * (Later: display in a web browser. ) */ public void show() { for(Post post : posts) { post. display(); System. out. println(); // Empty line. . . } } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 25

Subtyping First, we had: public void add. Message. Post( Message. Post message) public void add. Photo. Post( Photo. Post photo) Now, we have: public void add. Post(Post post) We call this method with: Photo. Post my. Photo = new Photo. Post(. . . ); feed. add. Post(my. Photo); Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 26

Subclasses and subtyping • Classes define types. • Subclasses define subtypes. • Objects of subclasses can be used where objects of supertypes are required. (This is called substitution. ) Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 27

Subtyping and assignment subclass objects may be assigned to superclass variables Vehicle v 1 = new Vehicle(); Vehicle v 2 = new Car(); Vehicle v 3 = new Bicycle(); Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 28

Subtyping and parameter passing public class News. Feed { public void add. Post(Post post) {. . . } } subclass objects may be used as actual parameters for the superclass Photo. Post photo = new Photo. Post(. . . ); Message. Post message = new Message. Post(. . . ); feed. add. Post(photo); feed. add. Post(message); Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 29

Object diagram Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 30

Class diagram Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 31

Polymorphic variables • Object variables in Java are polymorphic. (They can hold objects of more than one type. ) • They can hold objects of the declared type, or of subtypes of the declared type. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 32

Casting • We can assign subtype to supertype … • … but we cannot assign supertype to subtype! Vehicle v; Car c = new Car(); v = c; // correct c = v; // compile-time error! • Casting fixes this: c = (Car) v; (only ok if the vehicle really is a Car!) Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 33

Casting • • An object type in parentheses. Used to overcome 'type loss'. The object is not changed in any way. A runtime check is made to ensure the object really is of that type: – Class. Cast. Exception if it isn't! • Use it sparingly. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 34

The Object class All classes inherit from Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 35

Polymorphic collections • All collections are polymorphic. • The elements could simply be of type Object. public void add(Object element) public Object get(int index) • Usually avoided by using a type parameter with the collection. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 36

Polymorphic collections • A type parameter limits the degree of polymorphism: Array. List<Post> • Collection methods are then typed. • Without a type parameter, Array. List<Object> is implied. • Likely to get an “unchecked or unsafe operations” warning. • More likely to have to use casts. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 37

Collections and primitive types • Potentially, all objects can be entered into collections. . . • . . . because collections can accept elements of type Object. . . • . . . and all classes are subtypes of Object. • Great! But what about the primitive types: int, boolean, etc. ? Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 38

Wrapper classes • Primitive types are not objects types. Primitive-type values must be wrapped in objects to be stored in a collection! • Wrapper classes exist for all primitive types: simple type int float char. . . wrapper class Integer Float Character. . . Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 39

Wrapper classes wrap the value int i = 18; Integer iwrap = new Integer(i); … unwrap it int value = iwrap. int. Value(); In practice, autoboxing and unboxing mean we don't often have to do this explicitly Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 40

Autoboxing and unboxing private Array. List<Integer> mark. List; … public void store. Mark(int mark) { mark. List. add(mark); autoboxing } int first. Mark = mark. List. remove(0); unboxing Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 41

Review • Inheritance allows the definition of classes as extensions of other classes. • Inheritance – – avoids code duplication allows code reuse simplifies the code simplifies maintenance and extending • Variables can hold subtype objects. • Subtypes can be used wherever supertype objects are expected (substitution). Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 42