====== Konstruktoren und Vererbung ====== {{:aufgabe.png?nolink |}} === (A1) Ausprobieren === Experimentiere zunächst mit der Vorlage von https://codeberg.org/qg-info-unterricht/school-net-qg-v2. Die Vorlage enthält eine Version des NewsFeeds, in der Vererbung wie bisher besprochen implementiert ist. Die Diagramme in der BlueJ-Oberfläche zeigen die Vererbungsbeziehungen an. * Öffne den Quelltext der Klasse ''TextBeitrag()'' und entferne "extends Beitrag" in der Klassendefinition. Übersetze die Klasse erneut. Welche Veränderung beobachtest du am Klassendiagramm? Füge anschließend "extends Beitrag" wieder ein. * Erzeuge ein TextBeitrags-Objekt. Rufe einige seiner Methoden auf. Kannst du auch die geerbten Methoden aufrufen, z.B ''erfasseKommentar''? Was beobachtest du bei den geerbten Methoden? ===== Superklasse ===== Der Konstruktor der Superklasse initialisiert die in der Superklasse festgelegten Attribute: public class Beitrag { private String username; private long timestamp; private int likes; private ArrayList comments; /** * Initialisiere die Felder von Beitrag */ public Beitrag(String author) { username = author; timestamp = System.currentTimeMillis(); likes = 0; comments = new ArrayList<>(); } // weitere Methoden } ===== Was macht der Konstruktor einer abgeleiteten Klasse? ===== Bei der Instanziierung eines Objekts einer abgeleiteten Klasse wird zunächst immer der Konstruktor der abgeleiteten Klasse aufgerufen. **Problem:** Auch der ''TextBeitrag'' hat einen Autor – bei der Instanziierung eines TextBeitrags muss also das von der Superklasse geerbte Attribut ''username'' mit dem Parameter ''author'' initialisiert werden, aber wie? public class TextBeitrag extends Beitrag { private String message; /** * Konstruktor fuer TextBeitrag-Objekte */ public TextBeitrag(String author, String text) { // PROBLEM: username muss irgendwie auf author // gesetzt werden?! // das ist klar. message = text; } // methods omitted } **Lösung:** Der Konstruktor der abgeleiteten Klasse ruft **immer** den Konstruktor der Superklasse auf: ''super(…parameter…);'' So werden alle geerbten Attribute initialisisert, wenn ein Objekt der abgeleiteten Klasse instanziiert wird. **Achtung:** Wenn der super-Aufruf nicht explizit angegeben wird, wird super implizit ohne Argumente aufgerufen! ===== Zusammenfassung ===== * Die Konstruktoren abgeleiteter Klassen müssen **immer** einen Aufruf des Konstruktors der Superklasse (''super'') beinhalten. *** Wenn der Programmierer keinen ''super''-Aufruf in seinen Code einfügt, macht das der Compiler**. Dann wird super ohne Parameter aufgerufen – das geht schief, wenn der Konstruktor der Superklasse Parameter benötigt. * Der ''super''-Aufruf muss **das erste Statement** im Konstruktor der abgeleiteten Klasse sein. ==== Material ==== {{simplefilelist>.:*}}