{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Software Entwicklung \n",
"\n",
"## Kapitel 8: Objektorientierung\n",
"\n",
"### 8.8 Vererbung\n",
"\n",
"Neue Klassen können auch bestehende Klassen erweitern.\n",
"Die neue Klasse wird von einer oder mehreren *Oberklassen*\n",
"abgeleitet und ist in dieser Beziehnung die *Unterklasse*.\n",
"Die Oberklassen werden bei der Klassendefinition\n",
"zwischen den Klammern angegeben.\n",
"\n",
" class Unterklasse(Oberklasse1, Oberklasse2, ...):
"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Die *Unterklasse* erbt alle Attribute und Methoden\n",
"der *Oberklassen*."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"class Student():\n",
"\n",
" def __init__(self, name):\n",
" self.__name = name\n",
"\n",
" def __str__(self):\n",
" return self.__name\n",
"\n",
"\n",
"class BMEDStudent(Student):\n",
"\n",
" def get_major_subject(self):\n",
" return None\n",
"\n",
"\n",
"s = BMEDStudent(\"Herbert\")\n",
"print(str(s))\n",
"print(s.get_major_subject())"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"In einer Unterklasse können neue Methoden und\n",
"Attribute ergänzt sowie geerbte Methoden überschrieben werden."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"class BMMFStudent(BMEDStudent):\n",
"\n",
" def get_favorite_lecture(self):\n",
" return \"Software Entwicklung\"\n",
"\n",
" def get_major_subject(self):\n",
" return \"MF\"\n",
"\n",
"s = BMMFStudent(\"Helga\")\n",
"print(str(s))\n",
"print(s.get_major_subject())"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Gelegentlich benötigt man in einer Unterklasse Zugriff auf Methoden der Oberklassen\n",
"in dem Zustand, *bevor* sie überschrieben wurden. Dies kann mit der\n",
"Built-In Funktion *super* erreicht werden, die das aktuelle Objekt im Gewand der\n",
"Oberklasse zurückgibt, so dass die Methoden der Oberklasse aufgerufen werden können."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"class BMEIStudent(BMEDStudent):\n",
"\n",
" def get_major_subject(self):\n",
" return \"EI\"\n",
"\n",
" def __str__(self):\n",
" return super().__str__() + \" \" + self.get_major_subject()\n",
"\n",
"s = BMEIStudent(\"Henning\")\n",
"print(str(s))\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
},
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### 8.9 Polymorphie\n",
"\n",
"Der Begriff *Polymorphie* stammt aus dem Griechischen und setzt sich zusammen aus\n",
"\n",
"* πολύς (polýs) = \"viel\"\n",
"* μορφή (morphé) = \"Gestalt\"\n",
"\n",
"Beschrieben wird damit der Umstand, dass der Aufrufer einer Methode nicht genau wissen muss,\n",
"welches Objekt er vor sich hat, und dennoch die richtige Methode ausgeführt wird."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"from random import random\n",
"\n",
"if random() < 0.5:\n",
" s = BMMFStudent(\"Hans\")\n",
"else:\n",
" s = BMEIStudent(\"Hannelore\")\n",
"\n",
"print(s.get_major_subject())"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"Die Methode get_major_subject
ist im obigen Beispiel *polymorph*.\n",
"\n",
"\n"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.9"
}
},
"nbformat": 4,
"nbformat_minor": 1
}