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