Übungsblatt 04 - Lösungsvorschlag

Werbung
Universität Augsburg, Institut für Informatik
Prof. Dr. Werner Kießling
M. Endres, A. Huhn, T. Preisinger
Sommersemester 2006
06. Juni. 2006
Lösungsblatt 4
Informatik II
Aufgabe 1: Vererbung und Polymorphismus
Media.java
package blatt04.media;
// Klasse Media
public class Media{
// title,
protected
protected
protected
author and price
String title;
String author;
float price;
// Kontruktor
// Verwendung von set-Methoden
public Media(String title, String author, float price) {
setTitle(title);
setAuthor(author);
setPrice(price);
}
// Konstruktor nur fuer title und author
public Media(String title, String author) {
this(title,author,0);
}
// Kopierkonstruktor
public Media(Media m) {
this(m.title, m.author, m.price);
}
// toString
// liefert einen String zurueck
public String toString() {
return "Titel: " + title + "; Author: " + author + "; Price: " + price;
}
// getter und setter-Methode
// damit auch von ’aussen’ zugegriffen werden kann
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getAuthor() { return author; }
public void setAuthor(String author) { this.author = author; }
public float getPrice() { return price; }
public void setPrice(float price) { this.price = price; }
}
1
PrintMedia.java
package blatt04.media;
//abstrakte Klase PrintMedia
//enthaelt hier nur konkrete Methoden
abstract class PrintMedia extends Media {
// Anzahl der Seiten
protected int number_of_pages;
// Konstruktor, damit spaeter von den Unterklassen
// der Konstruktor von Media aufgerufen werden kann
protected PrintMedia(String title, String author,
int number_of_pages) {
super(title, author);
setNumberOfPages(number_of_pages);
}
// getter und setter
public void setNumberOfPages(int pages) {
number_of_pages = pages; }
public int getNumberOfPages() { return number_of_pages; }
// toString fuer eine saubere Ausgabe auf der Konsole
public String toString() {
return super.toString() + "; Pages = " + number_of_pages;
}
}
SoundMedia.java
package blatt04.media;
//abstrakte Klase SoundMedia
//enthaelt eine abstrakte Methode
abstract class SoundMedia extends Media {
// Laenge des Musikstuecks
protected double duration;
// Konstruktor, damit spaeter von den Unterklassen
// der Konstruktor von Media aufgerufen werden kann
protected SoundMedia(String title, String author,
double duration) {
super(title, author);
setDuration(duration);
}
// Konstruktor nur fuer title und author
protected SoundMedia(String title, String author) {
super(title, author); }
// getter und setter
public void setDuration(double duration) {
this.duration = duration; }
public double getDuration() { return duration; }
2
// einzige abstrakte Methode
// muss in den Unterklasse implementiert werden
public abstract void printSongTitles();
}
Book.java
package blatt04.media;
// import von PrintMedia nicht notwendig,
// da im gleichen Paket
// Klasse Buch
public class Book extends PrintMedia {
// ISBN Nummer
private String ISBN;
// Konstruktor
public Book(String title, String author, int pages,
String ISBN) {
// Konstruktor der Oberklasse aufrufen
super(title,author,pages);
// ISBN setzen
setISBN(ISBN);
}
public Book(Book b) {
this(b.title, b.author, b.getNumberOfPages(), b.ISBN);
}
// toString zur Ausgabe auf der Konsole
public String toString() {
// toString der Oberklasse mit ISBN konkatenieren
return super.toString() + "; ISBN = " + ISBN;
}
// set- und get-Methoden
public void setISBN(String ISBN) { this.ISBN = ISBN; }
public String getISBN() { return ISBN; }
}
Disc.java
package blatt04.media;
//import von Media nicht notwendig,
//da im gleichen Paket
//Klasse Disc
public class Disc extends SoundMedia {
// Anzahl der Tracks auf einer CD
private int tracks;
// Konstruktor
public Disc(String title, String author,
double duration, int tracks) {
// Konstruktor der Oberklasse aufrufen
super(title, author, duration);
3
// setzen der Tracks
setTracks(tracks);
}
public Disc(Disc d) {
this(d.title, d.author, d.duration, d.tracks); }
// set- und get-Methoden
public void setTracks(int tracks) {
this.tracks = tracks; }
public int getTracks() { return this.tracks; }
// Implementierung der Ausgabe der Titel
public void printSongTitles() {
// Hier koennte alternativ nach den Titel in einer
// Online-Datenbank, z.B. cddb gesucht werden
System.out.println("Suche in einer Datenbank nach Titeln");
}
}
Record.java
package blatt04.media;
//import von Media nicht notwendig,
//da im gleichen Paket
//Klasse Record
public class Record extends SoundMedia {
// Umdrehungen pro Minute
// Langspielplatten 33 rpm
// Singles 45 rpm
private int rpm;
// Konstruktor
public Record(String title, String author,
double duration, int rpm) {
// Konstruktor der Oberklasse aufrufen
super(title, author, duration);
// Umdrehungen festlegen
setRPM(rpm);
}
public Record(Record r) {
this(r.title, r.author, r.duration, r.rpm);
}
// get- und set-Methoden
public void setRPM(int rpm) { this.rpm = rpm;
public int getRPM() { return this.rpm; }
}
// Implementierung der Ausgabe der Titel
public void printSongTitles() {
// Natuerlich gibt es auch eine Datenbank fuer
// Schallplatten, aber hier soll einfach
// mal folgendes ausgegeben werden:
System.out.println("Keine Online-Informationen vorhanden");
}
}
4
Aufgabe 2: Schnittstellen und instanceof
FilmMedia.java
package blatt04.media;
//interface FilmMedia
//Methoden muessen in den entsprechenden
//Klassen implementiert werden
public interface FilmMedia {
// Loeschen der Daten
public abstract void erase();
// Test auf Vergleich
public abstract boolean equals(Media m);
}
DVD.java
package blatt04.media;
//import von SoundMedia nicht notwendig,
//da im gleichen Paket
// Klasse DVD
// Unterklasse von SoundMedia
// benutzt die Schnittstelle FilmMedia
// und muss damit alle Methoden aus
// FilmMedia implementieren
public class DVD extends SoundMedia implements FilmMedia {
// Konstruktor
public DVD(String title, String author, double duration)
super(title,author,duration);
}
public DVD(DVD d) { this(d.title, d.author, d.duration); }
// Implementierung der Methode erase()
// aus dem Interface FilmMedia
// Einfach alles auf null bzw. 0 setzen
public void erase() {
setTitle(null);
setAuthor(null);
setPrice(0);
setDuration(0);
}
// Implementierung der Methode equals()
// aus dem Interface FilmMedia
public boolean equals(Media m) {
// zuerst ueberpruefen, ob m auch ein Tontraeger ist
// somit kann kein PrintMedia verglichen werden
if(!(m instanceof SoundMedia))
return false;
// Titel und Autor vergleichen
if(m.title == this.title && m.author == this.author)
return true;
// wenn die beiden Medien nicht gleich sind
5
{
// falsch zurueckgeben
return false;
}
// Implementierung von printSongTitles
public void printSongTitles() {
System.out.println("Keine DVD-Informationen vorhanden");
}
}
Aufgabe 3: Media Test
MediaTest.java
package blatt04.mediatest;
// import des media-Pakets
import blatt04.media.*;
// Klasse mit main
public class MediaTest {
public static void main(String[] args) {
// von jeder Klasse ein Objekt erzeugen
// und ggf. Preis setzen
Media media = new Media("MediaTitel", "MediaAuthor", 0);
Book book = new Book("Harry Potter", "J. K. Rowling",
656, "3551566666");
book.setPrice(42.95f);
Disc disc = new Disc("Greatest Hits", "Queen", 59.19, 17);
disc.setPrice(9.95f);
Record record = new Record("The Dark Side Of The Moon",
"Pink Floyd", 39.31, 33);
record.setPrice(16.90f);
DVD dvd1 = new DVD("Star Wars I", "Ewan McGregor", 202);
dvd1.setPrice(24.95f);
DVD dvd2 = new DVD(dvd1);
dvd2.setPrice(29.95f);
// Array von Media
Media arrayOfMedia[] = new Media[6];
arrayOfMedia[0]
arrayOfMedia[1]
arrayOfMedia[2]
arrayOfMedia[3]
arrayOfMedia[4]
arrayOfMedia[5]
=
=
=
=
=
=
media;
book;
disc;
record;
dvd1;
dvd2;
// durchlaufen des Arrays
// und Ausgabe der Daten
for(Media m : arrayOfMedia) {
System.out.println(m.toString());
}
// Vergleich von dvd1 und dvd2
System.out.println("DVD1 equals DVD2 ?: " + dvd1.equals(dvd2));
}
}
6
Herunterladen