Übungen Vererbung
parent
561df9f8c3
commit
5a9c45103c
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue