diff --git a/03 Objektorientierung/02 Vererbung/03 Übung.ipynb b/03 Objektorientierung/02 Vererbung/03 Übung.ipynb new file mode 100644 index 0000000..498baaa --- /dev/null +++ b/03 Objektorientierung/02 Vererbung/03 Übung.ipynb @@ -0,0 +1,206 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c4b4353b", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Aufgabe 03.02.2 - Geräteverwaltung\n", + "\n", + "In diesem Notebook übst du das Prinzip der **Vererbung** anhand eines alltagsnahen Beispiels aus dem Schulkontext.\n", + "\n", + "## Hinweise vorab:\n", + "Verwende in den Unterklassen den Konstruktor der Oberklasse mit `super(...)`.\n", + "\n", + "Achte darauf, dass die geerbten Eigenschaften nicht erneut in den Unterklassen definiert werden." + ] + }, + { + "cell_type": "markdown", + "id": "a1d972e7", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 1: Basisklasse `Geraet`\n", + "\n", + "Erstelle eine Klasse `Geraet` mit folgenden Eigenschaften:\n", + "\n", + "- `name: string`\n", + "- `inventarNummer: number`\n", + "\n", + "sowie einer Methode:\n", + "\n", + "- `getInfo(): string`\n", + " - Gibt eine Beschreibung des Geräts zurück, z. B.\n", + " `\"Lehrer-Laptop 3 (Inventar-Nr. 1023)\"`\n", + "\n", + "**Hinweis:** Diese Klasse soll später als Oberklasse dienen." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c46b28f3", + "metadata": {}, + "outputs": [], + "source": [ + "// TODO: Klasse Geraet hier implementieren\n" + ] + }, + { + "cell_type": "markdown", + "id": "b05ab6c1", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 2: Abgeleitete Klasse `Laptop`\n", + "\n", + "Erstelle eine Klasse `Laptop`, die **von `Geraet` erbt**.\n", + "\n", + "Zusätzliche Eigenschaft:\n", + "\n", + "- `betriebssystem: string`\n", + "\n", + "Zusätzliche Methode:\n", + "\n", + "- `starten(): string`\n", + " - z. B. `\"Laptop Lehrer-Laptop 3 mit Windows wird gestartet.\"`\n", + "\n", + "**Hinweis:** Verwende im Konstruktor `super(...)`, um den Konstruktor der Oberklasse aufzurufen." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1e60185f", + "metadata": {}, + "outputs": [], + "source": [ + "// TODO: Klasse Laptop hier implementieren\n" + ] + }, + { + "cell_type": "markdown", + "id": "20935441", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 3: Abgeleitete Klasse `Tablet`\n", + "\n", + "Erstelle eine Klasse `Tablet`, die ebenfalls **von `Geraet` erbt**.\n", + "\n", + "Zusätzliche Eigenschaft:\n", + "\n", + "- `stiftVorhanden: boolean`\n", + "\n", + "Zusätzliche Methode:\n", + "\n", + "- `zeichnen(): string`\n", + " - Gibt nur dann `\"Zeichnen mit dem Tablet möglich.\"` zurück,\n", + " wenn ein Stift vorhanden ist,\n", + " sonst `\"Kein Stift vorhanden.\"`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0a97a012", + "metadata": {}, + "outputs": [], + "source": [ + "// TODO: Klasse Tablet hier implementieren\n" + ] + }, + { + "cell_type": "markdown", + "id": "f2cb0748", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 4: Nutzung der Klassen\n", + "\n", + "1. Erzeuge ein Objekt der Klasse `Laptop`.\n", + "2. Erzeuge ein Objekt der Klasse `Tablet`.\n", + "3. Rufe bei beiden Objekten die Methode `getInfo()` auf.\n", + "4. Rufe zusätzlich die jeweils spezifischen Methoden auf:\n", + " - `starten()` beim Laptop\n", + " - `zeichnen()` beim Tablet\n", + "\n", + "Überprüfe die Rückgabewerte mithilfe von `console.log(...)`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0cbfb6f1", + "metadata": {}, + "outputs": [], + "source": [ + "// TODO: Objekte erzeugen und Methoden testen\n" + ] + }, + { + "cell_type": "markdown", + "id": "15fcd64d", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Merksatz\n", + "\n", + "- **Gemeinsame Eigenschaften und Methoden** → Oberklasse\n", + "- **Spezielle Eigenschaften und Methoden** → Unterklasse\n", + "\n", + "Dieses Prinzip hilft, Code übersichtlich und wartbar zu halten." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "codemirror_mode": "typescript", + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nbconvert_exporter": "script", + "pygments_lexer": "typescript", + "version": "5.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/03 Objektorientierung/02 Vererbung/04 Übung.ipynb b/03 Objektorientierung/02 Vererbung/04 Übung.ipynb new file mode 100644 index 0000000..2ed3642 --- /dev/null +++ b/03 Objektorientierung/02 Vererbung/04 Übung.ipynb @@ -0,0 +1,240 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "62e51929", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Vererbung in TypeScript – Geometrische Figuren\n", + "\n", + "In diesem Notebook modellierst du **geometrische Figuren** mithilfe von **objektorientierter Programmierung** und **Vererbung**." + ] + }, + { + "cell_type": "markdown", + "id": "528e0733", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 1: Basisklasse `Figur`\n", + "\n", + "Erstelle eine Klasse `Figur` mit folgender Eigenschaft:\n", + "\n", + "- `name: string`\n", + "\n", + "sowie folgenden Methoden:\n", + "\n", + "- `umfang(): number` → gibt standardmäßig `0` zurück\n", + "- `flaeche(): number` → gibt standardmäßig `0` zurück\n", + "- `getInfo(): string`\n", + " - gibt z. B. zurück:\n", + " `\"Figur: Rechteck, Umfang: 14, Fläche: 12\"`\n", + "\n", + "**Hinweis:** Die Methoden `umfang()` und `flaeche()` sollen in den Unterklassen überschrieben werden." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85cf4730", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "// TODO: Klasse Figur hier implementieren\n" + ] + }, + { + "cell_type": "markdown", + "id": "dea8839f", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 2: Abgeleitete Klasse `Rechteck`\n", + "\n", + "Erstelle eine Klasse `Rechteck`, die **von `Figur` erbt**.\n", + "\n", + "Zusätzliche Eigenschaften:\n", + "\n", + "- `breite: number`\n", + "- `hoehe: number`\n", + "\n", + "Überschreibe die Methoden:\n", + "\n", + "- `umfang(): number` → `2 * (breite + hoehe)`\n", + "- `flaeche(): number` → `breite * hoehe`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e33fec4", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "// TODO: Klasse Rechteck hier implementieren\n" + ] + }, + { + "cell_type": "markdown", + "id": "b7d388ad", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 3: Abgeleitete Klasse `Kreis`\n", + "\n", + "Erstelle eine Klasse `Kreis`, die **ebenfalls von `Figur` erbt**.\n", + "\n", + "Zusätzliche Eigenschaft:\n", + "\n", + "- `radius: number`\n", + "\n", + "Überschreibe die Methoden:\n", + "\n", + "- `umfang(): number` → `2 * Math.PI * radius`\n", + "- `flaeche(): number` → `Math.PI * radius * radius`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "312b3f23", + "metadata": {}, + "outputs": [], + "source": [ + "// TODO: Klasse Kreis hier implementieren\n" + ] + }, + { + "cell_type": "markdown", + "id": "d757634c", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 4: Klasse `Quadrat`\n", + "\n", + "Ein Quadrat ist ein **spezielles Rechteck**, bei dem alle Seiten gleich lang sind.\n", + "\n", + "Erstelle eine Klasse `Quadrat`, die **von `Rechteck` erbt**.\n", + "\n", + "Zusätzliche Eigenschaft:\n", + "\n", + "- `seitenlaenge: number`\n", + "\n", + "**Hinweis:** Übergib die Seitenlänge sinnvoll an den Konstruktor der Oberklasse `Rechteck`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d38d2215", + "metadata": {}, + "outputs": [], + "source": [ + "// TODO: Klasse Quadrat hier implementieren\n" + ] + }, + { + "cell_type": "markdown", + "id": "72cfd572", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 5: Nutzung der Klassen\n", + "\n", + "1. Erzeuge:\n", + " - ein Rechteck,\n", + " - einen Kreis,\n", + " - ein Quadrat.\n", + "2. Gib für jede Figur die Methode `getInfo()` aus.\n", + "3. Überprüfe die Ergebnisse mit `console.log(...)`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd294321", + "metadata": {}, + "outputs": [], + "source": [ + "// TODO: Objekte erzeugen und Methoden testen\n" + ] + }, + { + "cell_type": "markdown", + "id": "bc077348", + "metadata": { + "editable": false, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Denkfrage\n", + "\n", + "Warum ist es sinnvoll, die Methoden `umfang()` und `flaeche()` bereits in der Basisklasse `Figur` zu definieren, obwohl ihre konkrete Berechnung erst in den Unterklassen erfolgt?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "codemirror_mode": "typescript", + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nbconvert_exporter": "script", + "pygments_lexer": "typescript", + "version": "5.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}