aktuelle.kurse/old_m226ab/3-Auftraege-Uebungen/A25-Inheritance_Polymorphism_Composition.md

347 lines
15 KiB
Markdown
Raw Normal View History

2021-08-13 01:11:41 +02:00
# Inheritance Polymorphism Composition
Zeitbedarf: 120-240 min
Bearbeiten Sie selbständig das Dokument inheritance_and_polymorphism.docx . Sie können sich helfen lassen, aber Sie müssen die Aufgabe selber lösen und auch auf Ihrem Rechner zeigen können.
Sie werden dazu die vorgefertigten Code-Teile brauchen, die Sie in der Datei SocialNetwork.zip finden.
Aus didaktischen Gründen werden Sie auf eine Falschprogrammierung geführt. Lassen Sie das zu und machen Sie alles im Detail durch und zeigen Sie der Lehrperson die Resultate und die Zwischenresultate.
Wenn Sie fertig sind, geben Sie die Aufgabe ab oder zeigen Sie sie der LP.
## start
![http://www.congregationalresources.org/Images/GoldenGeneDNA.jpg](media/ab05bde6d3d7367ec2e3273a159532e5.jpeg)**Inheritance
& Polymorphism**
What we will learn:
In this session we will look at the OO concept „inheritance“.
We will learn what polymorphism means.
We will also learn the concepts of overloading and overwriting.
**Contents**
> [Wrong Programming 2](#_Toc24395775)
> [1.1 Extending a Social-Network Simulator in the wrong way 2](#_Toc24395776)
> [1.1.1 Exercise Adding an Event Post 2](#_Toc24395777)
> [1.1.2 Exercise Extending the NewsFeed class with
> EventPost 2](#_Toc24395778)
> [2 Using Inheritance 4](#_Toc24395779)
> [2.1 Analysis of the wrong solution 4](#_Toc24395780)
> [2.2 Step-by-step to better coding 4](#_Toc24395781)
> [2.2.1 Exercise create a new Post class as superclass 5](#_Toc24395782)
> [2.2.2 Exercise Simplifying the NewsFeed Class 5](#_Toc24395783)
> [2.3 Final product 5](#_Toc24395784)
> [2.3.1 Simple print-out and a smarter print-out of
> attributes 6](#_Toc24395785)
> [2.4 Some Information on Overriding methods 6](#_Toc24395786)
> [3 Exercises for Competences in the First Column 7](#_Toc24395787)
> [3.1 Exercise Understanding Symbols 7](#_Toc24395788)
> [3.2 Exercise New Project “Flix-Bus Switzerland” 7](#_Toc24395789)
> [3.3 Exercise Including inheritance 8](#_Toc24395790)
> [3.4 Alternative Exercise Your own example 8](#_Toc24395791)
> [3.5 Exercise Relations 8](#_Toc24395792)
> [3.6 Exercise Managing your trips 8](#_Toc24395793)
> [3.7 Exercise Overriding Methods 9](#_Toc24395794)
> [3.8 Exercise Overloading Methods 9](#_Toc24395795)
> [3.9 Exercise UML Classdiagram (1A) 9](#_Toc24395796)
> [3.9.1 Exercise Testing (3A) 9](#_Toc24395797)
#
Wrong Programming
## Extending a Social-Network Simulator in the wrong way
In order to understand the benefits of inheritance, were going program a social
network simulator …. and program it in the wrong way first. We will notice how
this approach makes maintenance and extensions more difficult and complex.
We want a program with following classes:
MessagePost Class for messages.
PhotoPost Class for photos.
NewsFeed Class has a collection of message and photo posts.
Install the classes from the downloaded source folder.
Each post class has a display-method to print details of the post.
### Exercise Adding an Event Post
Extend the SocialNetwork by adding a new type of post:
EventPost Class for events.
The class has following attributes:
private String author;
private long timeStamp;
private int pages;
private int likes;
private ArrayList\<String\> comments;
Implement the constructor and necessary methods accordingly.
### Exercise Extending the NewsFeed class with EventPost
Now we obviously have to add this new post type to our *NewsFeed* class.
private ArrayList\<EventPost\> events;
Further, we have to initialize this list also in the constructor. And add the
necessary methods.
**Analysis:**
Obviously, this approach is very tiring and error-prone.
List down the main problems with this approach:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
#
Using Inheritance
## Analysis of the wrong solution
One main problem is the duplicated code we are adding. Most attributes in all
three post classes are the same.
And we have to extend the NewsFeed class, with code which is repetitive and
cumbersome. Mistakes can happen easily while extending the code. We might even
break existing code.
And theres more: if we decide to change the comment attribute from
ArrayList\<String\> to ArrayList\<Comment\> we have to change this at several
points in the code.
Idea: When we extend our program, we only want to add the new classes. But we
dont want to change the remaining classes. For example, when we add a new post
class, we dont want to change the NewsFeed class.
## Step-by-step to better coding
Inheritance is an important concept in object-orientated programming. Classes
can inherit from other classes. This means a class can inherit attributes and
methods from another class.
In a first step we want to implement a *Post* class which unifies all shared
attributes of the several post classes. From this super class all post classes
will inherit attributes and methods. If necessary, a post class can have its own
special attributes.
This is how inheritance is programmed in Java:
### Exercise create a new Post class as superclass
Identify the common attributes of the post classes and add these to a new Post
class. This class is the superclass of all other post classes.
The new structure should look like this:
### Exercise Simplifying the NewsFeed Class
Refactor the *NewsFeed* class accordingly. We want one *ArrayList* which deals
with all posts.
## Final product
The **NewsFeed** class only works with the new **Post** class and does not have
any knowledge of the subclasses.
This will simplify any extensions we do later.
### ![Macintosh HD:Users:rlanza:Documents:Daten-Schule:Unterricht:_Diverses:_Admin:__medal.jpg](media/6ae396fbdefb7ebc0afccaed1bc512b4.jpeg)Simple print-out and a smarter print-out of attributes
Make sure that your superclass *Post* has the *display()* method.
1. We want a simple print-out of the general attributes which every post has.
1. ![Macintosh
HD:Users:rlanza:Documents:Daten-Schule:Unterricht:_Diverses:_Admin:__medal.jpg](media/6ae396fbdefb7ebc0afccaed1bc512b4.jpeg)![Macintosh
HD:Users:rlanza:Documents:Daten-Schule:Unterricht:_Diverses:_Admin:__medal.jpg](media/6ae396fbdefb7ebc0afccaed1bc512b4.jpeg)Now
also include the special attributes of each extended post subclass. What
must you do in the method of the subclass in order to combine both
attributes (from superclass and subclass)?
- Show your results to the teacher.
## Some Information on Overriding methods
When printing out attributes you have to see that the superclass and subclasses
work together. Especially you have to make sure that the print-method of the
superclass is overridden in the subclass. Youll find some tips on this on
following websites:
<http://docs.oracle.com/javase/tutorial/java/IandI/override.html>
<https://beginnersbook.com/2014/01/method-overriding-in-java-with-example/>
| Notes | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
|-------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
#
Exercises for Competences in the First Column
Do following exercises and use the internet to research for definitions or
examples.
Exercises 1 6 will show that you have understood the basic concept of
inheritance and that you can use overriding and overloading of methods.
Exercises 7 and 8 show that you can draw a design in detail (with IS and HAS
relationships) and that you can implement unit-tests.
## Exercise Understanding Symbols
Look at following diagrams and use examples from our daily lives (school, work,
etc.) to show the different relationships. Fill in the blanks:
IS-Relation HAS-Relation
## Exercise New Project “Flix-Bus Switzerland”
We want to implement a small system which simulates a national bus service in
Switzerland. The company “Flix-Bus” offers services to national but also
international destinations. (-\> see similar exercise “Airport” in the compendio
book).
Our system should have following classes:
Class Responsibility
> BusTerminal has all information which bus leaves from which platform
> List of platforms, Name of Terminal
> Platform has a number and information about bus type
> Platform number, platform size, bus service (national or international), bus
> type (small or large), occupied or not occupied
Travel has all specific information about a bus trip
Destination, departure time, arrival time, national or international
> Bus has all information of the bus type
> bus type (double decker, single), passenger capacity, comfort (basic or 1st
> class)
- Before you start coding, do a design (UML classdiagram) of the relationships
between classes. This is part of competence 1A.
## Exercise Including inheritance
![Macintosh
HD:Users:rlanza:Documents:Daten-Schule:Unterricht:_Diverses:_Admin:__medal.jpg](media/6ae396fbdefb7ebc0afccaed1bc512b4.jpeg)Flix-bus
wants to make sure that the bus terminal can deal with different types of buses.
In order to do this, your system should make a distinction between the vehicles
they use. Flix-bus uses double decker coaches for international destinations and
a smaller, single-floored bus for national destinations.
Be creative and implement a form of inheritance.
Class Responsibility
Vehicle has all basic information about the vehicle
## ![Macintosh HD:Users:rlanza:Documents:Daten-Schule:Unterricht:_Diverses:_Admin:__medal.jpg](media/6ae396fbdefb7ebc0afccaed1bc512b4.jpeg)Alternative Exercise Your own example
You can also implement your own example to show an interaction between a
hierarchy of classes and a managing or data-pool class which can deal with these
different types. Maybe you want to start be defining some unit test cases: How
could you write a unit test before you have the code?
- See also the “Airport” example in the compendio book (see OneDrive folder)
## Exercise Relations
Implement a main program which instantiates the objects and creates a working
object-hierarchy.
Our application should allow the user to do following:
Check times when bus leaves on platform. The user can also generate a new trip
with a bus and the system checks what platform is available for that time.
Implement a text-based user interface which allows the user to see the schedule.
For example: when does the bus leave for Munich and on which platform?
## Exercise Managing your trips
Make sure that the platforms are correct for the right buses. All platforms can
be used for national buses, but only a few platforms are big enough to hold
international buses.
## Exercise Overriding Methods
One common OO feature is *overriding* methods. Use method overriding to
implement a *print-out.*
## Exercise Overloading Methods
The second common feature is *overloading* methods. Do some research on this
topic. Then show that you have understood this feature by implementing this in
your project.
## Exercise UML Classdiagram (1A)
You did a design before you started implementation. Now draw a UML-classdiagram
which shows the relationships of your project (in particular IS- and HAS
relationships). Use a tool to do this.
- Show your finished design to your teacher.
## Exercise Testing (3A)
Note down essential test cases which prove that your application works. Get a
colleague to do the testing for you.
Based on a script by Rinaldo Lanza, BBW. Adapted by Julian Käser. Latest version
Nov. 2019