inf-abi2027/03 Objektorientierung/02 Vererbung/02 Übung.ipynb

327 lines
9.4 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "46cadce2-54bf-43b6-879a-0adbcadd3359",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 03.02.1 - Fahrzeugrennen"
]
},
{
"cell_type": "markdown",
"id": "f9d902ab-5da0-4223-8f29-15850a2b96f2",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## 1. Klasse: `Fahrzeug`\n",
"\n",
"Für die Simulation eines Wettrennens sollen verschiedene Fahrzeugarten objektorientiert modelliert werden. Da alle Fahrzeugtypen gemeinsame Eigenschaften haben, definieren wir uns zunächst eine Basisklasse `Fahrzeug`, die als Oberklasse für die anderen Klassen dienen soll. Ein Fahrzeug hat folgende allgemeinen Merkmale:\n",
"* Seine aktuelle Position (in km und der Einfachheit halber in nur einer Dimension)\n",
"* Seine aktuelle Geschwindigkeit (in km/h)\n",
"* Seine Maximalgeschwindigkeit (in km/h)\n",
"* Seine Anzahl Räder\n",
"* Es kann bewegt werden (Methode `bewege`). Die Methode wird mit einem Parameter aufgerufen, der die Anzahl der Minuten angibt, die sich das Fahrzeug mit der aktuellen Geschwindigkeit vorwärts bewegt. Der Methodenaufruf ändert natürlich die Position des Fahrzeugs, wenn es mit\n",
"einer von 0 verschiedenen Geschwindigkeit bewegt wird.\n",
"* Man kann seine Geschwindigkeit setzen (Methode `setGeschwindigkeit`). Die Geschwindigkeit darf die Maximalgeschwindigkeit nicht überschreiten.\n",
"* Es kann seine Maximalgeschwindigkeit angeben (Methode `getMaxGeschwindigkeit`). Für ein Objekt der Klasse Fahrzeug soll die Maximalgeschwindigkeit 0 sein.\n",
"* Es kann die Anzahl seiner Räder angeben (Methode `getAnzahlRaeder`). Für ein Objekt der Klasse Fahrzeug soll diese ebenfalls 0 sein."
]
},
{
"cell_type": "raw",
"id": "5c6e1541-66d1-4135-8936-80ff7565506c",
"metadata": {},
"source": [
"Klasse \"Fahrzeug\":\n",
"\n",
"Attribute:\n",
"\n",
"Methoden:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5370cba1-9e51-4579-8d61-ac4d9a42c064",
"metadata": {},
"outputs": [],
"source": [
"class Fahrzeug {\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "3127bdc6-e1dc-4790-b9c0-9b92f5c2c93a",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## Vererbte Klassen\n",
"\n",
"Eine vererbte Klasse lässt sich wie eine normale Klasse anlegen. Wir müssen jedoch zusätzlich angeben, von welcher Hauptklasse diese Kindklasse abgeleitet wurde:\n",
"```\n",
"public class Fahrrad extends Fahrzeug {\n",
" [...]\n",
"}\n",
"```\n",
"\n",
"Mittels des Schlüsselwortes `extends` geben wir die Hauptklasse `Fahrzeug` an, von der die Klasse `Fahrrad` abgeleitet werden soll.\n",
"\n",
"Eine vererbte/abgeleitete Klasse übernimmt alle `public`-Attribute und -Methoden aus der Hauptklasse ohne dass diese neu in der Kindklasse definiert werden müssen! Zusätzlich können jedoch in der Kindklasse auch weitere Attribute und Methoden definiert werden, die dann nur für diese Klasse gelten.\n",
"*Hinweis: eine Kindklasse kann natürlich auch gleichzeitig wieder eine Oberklasse einer anderen Klasse sein. Eine Klasse kann aber nicht mehrere Oberklassen haben.*"
]
},
{
"cell_type": "markdown",
"id": "9b215306-4cf9-43fe-a992-62f5b4fc6ed1",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## 2. Teil\n",
"\n",
"Nun sollen einige konkrete Fahrzeuge definiert werden, indem entsprechende Klassen von Fahrzeug abgeleitet werden:\n",
"* Ein `Fahrrad` ist ein `Fahrzeug` mit 2 Rädern und Maximalgeschwindigkeit 30 km/h.\n",
"* Ein `Auto` ist ein `Fahrzeug` mit 4 Rädern und Maximalgeschwindigkeit 140 km/h.\n",
"* Ein `Rennwagen` ist ein `Auto` mit Maximalgeschwindigkeit 220 km/h.\n",
"* Ein `Krankenwagen` ist ein `Auto` mit einem zusätzlichen Blaulicht, das ein- oder ausgeschaltet sein kann (neues Attribut!). Außerdem muss der Krankenwagen Methoden zum Ein- bzw. Ausschalten des Blaulichts anbieten.\n",
"\n",
"Definiere diese Klassen und nutze dabei so weit wie möglich die Vererbung von Eigenschaften aus!"
]
},
{
"cell_type": "raw",
"id": "3b20ead1-5c15-4587-b5a4-ec1b5cf46076",
"metadata": {},
"source": [
"Klasse Fahrrad (extends Fahrzeug):\n",
"\n",
"Attribute:\n",
"\n",
"Methoden:\n"
]
},
{
"cell_type": "raw",
"id": "3fdb56f1-384b-42cb-be97-d3da243d8651",
"metadata": {},
"source": [
"Klasse Auto (extends Fahrzeug):\n",
"\n",
"Attribute:\n",
"\n",
"Methoden:\n"
]
},
{
"cell_type": "raw",
"id": "630da8e4-5e6f-4f6f-bb98-6974e1959420",
"metadata": {},
"source": [
"Klasse Rennwagen (extends Auto):\n",
"\n",
"Attribute:\n",
"\n",
"Methoden:\n"
]
},
{
"cell_type": "raw",
"id": "59fa4b05-9964-4139-9f50-8c086b9ae3e5",
"metadata": {},
"source": [
"Klasse Fahrrad (extends Auto):\n",
"\n",
"Attribute:\n",
"\n",
"Methoden:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f705f1f0-d8bb-42f9-abf0-91302100ba8f",
"metadata": {},
"outputs": [],
"source": [
"class Fahrrad extends Fahrzeug {\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "773e2df2-776f-4188-87b2-836f72bba714",
"metadata": {},
"outputs": [],
"source": [
"class Auto extends Fahrzeug {\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8c3cfc4a-8b25-450c-a39c-62a48ef22c4a",
"metadata": {},
"outputs": [],
"source": [
"class Rennwagen extends Auto {\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0846e1df-63df-4a51-ad53-ab625310d19c",
"metadata": {},
"outputs": [],
"source": [
"class Krankenwagen extends Auto {\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "b3f07e71-c867-403f-877e-3f69767fa013",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 03.02.2 - Wettrennen"
]
},
{
"cell_type": "markdown",
"id": "a117b7af-d22e-4449-9fe5-8cabaf98b209",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## 1. Simulation des Wettrennens\n",
"\n",
"Nun soll die eigentliche Simulation des Wettrennens in einer Klasse `Wettrennen` geschrieben werden.\n",
"\n",
"Erzeuge je ein Fahrzeug und setze dann die Geschwindigkeiten mit der Methode `setGeschwindigkeit` auf:\n",
"* Fahrrad 20 km/h\n",
"* Auto 150 km/h\n",
"* Rennwagen 200 km/h\n",
"* Krankenwagen 80 km/h\n",
"\n",
"Dann sollen sich die Fahrzeuge bewegen. Der Gerechtigkeit halber geben wir dem Fahrrad einen Vorsprung von 4 Stunden. \n",
"\n",
"Lasse danach alle Fahrzeuge eine Stunde lang mit unveränderter Geschwindigkeit vorwärts fahren. Was fällt dir beim Auto auf?"
]
},
{
"cell_type": "raw",
"id": "bda7030b-5f34-41aa-ab66-15f07e8b3ad8",
"metadata": {},
"source": [
"Klasse \"Wettrennen\":\n",
"\n",
"Attribute:\n",
"\n",
"Methoden:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "40d899ba-3f7c-45f6-842b-33878d7d5d6b",
"metadata": {},
"outputs": [],
"source": [
"class Wettrennen {\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "c7184800-9f9e-4322-85be-6482bb3ebab2",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## 2. Ausgabe eines Fahrzeugs\n",
"\n",
"Wir wollen später die Infos über die Fahrzeuge auch ausgeben lassen. Ergänze dazu in der `Fahrzeug`-Klasse oben eine Methode `toString()` die einen String der Form zurückgibt:\n",
"```\n",
"Das Fahrzeug fährt aktuell 12km/h und hat schon eine Strecke von 34km zurückgelegt\n",
"```\n",
"\n",
"Ergänze daraufhin die Klasse Wettrennen um eine Methode `zwischenstand()`, die den aktuellen Zwischenstand ausgibt und dabei die Methode `toString` von jedem einzelnen Fahrzeug aufruft."
]
},
{
"cell_type": "markdown",
"id": "0198ff1a-f4dc-49c0-9327-190d38623a1d",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## 3. Überschreibung von Methoden\n",
"\n",
"Programmiere in den Kindklassen `Auto` und `Krankenwagen` zusätzlich auch noch eine angepasste `toString`-Methode, bei der statt \"Das Fahrzeug...\" direkt \"Das Auto...\" bzw. \"Der Krankenwagen...\" ausgegeben wird.\n",
"\n",
"Ändere deine `zischenstand`-Methode gegenüber vorhin nicht ab und führe das Programm aus. Was erscheint auf der Konsole? Kannst du dir vorstellen, warum?"
]
}
],
"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
}