{"id":55000016,"date":"2015-04-01T00:00:00","date_gmt":"2020-03-27T19:16:33","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=16"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Objektorientierte_Programmierung_Vererbung_I","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Objektorientierte_Programmierung_Vererbung_I\/","title":{"rendered":"Objektorientierte Programmierung: Vererbung I"},"content":{"rendered":"<p><b>Eines der wichtigsten Merkmale der objektorientierten Programmierung ist die Vererbung. Dank der Vererbung kann man f&uuml;r ein Objekt eine Basisklasse erstellen, die grundlegende Eigenschaften und Methoden f&uuml;r dieses Objekt bereitstellt. Ben&ouml;tigen Sie nun ein weiteres Objekt, das auf dem ersten Objekt aufbaut, aber weitere oder ge&auml;nderte Eigenschaften und Methoden enth&auml;lt, m&uuml;ssten Sie ohne Vererbung die gleiche Klasse nochmal erstellen und nach ihren W&uuml;nschen anpassen. Dank Vererbung brauchen Sie in der Klasse f&uuml;r das neue Objekt jedoch nur die Erweiterungen und &Auml;nderungen zu definieren. Den Rest verwenden Sie von der ersten Klasse &#8211; und brauchen eine Menge Code nur an einer Stelle zu warten.<\/b><\/p>\n<p>Sie k&ouml;nnen nat&uuml;rlich, genau wie bei Tabellen einer Datenbank, ein Objekt erstellen, das alle denkbaren Eigenschaften und Methoden liefert (beziehungsweise im Fall einer Tabelle entsprechende Felder enth&auml;lt). Ein Beispiel w&auml;re eine Tabelle, die zun&auml;chst nur Personendaten enth&auml;lt, die dann aber um Daten f&uuml;r verschiedene Arten von Personen erweitert wird &#8211; f&uuml;r Mitarbeiter, Kunden et cetera.<\/p>\n<p>In der Tabelle blieben dann, je nachdem, ob man einen Mitarbeiter oder einen Kunden pflegen m&ouml;chte, die jeweils f&uuml;r den anderen Personentyp vorgesehenen Felder leer. Damit diese nicht versehentlich gef&uuml;llt werden, w&uuml;rde man daf&uuml;r verschiedene Formulare vorsehen, von denen eines nur die Basisdaten plus die Mitarbeiterfelder und ein anderes nur die Basisdaten plus die Kundenfelder anzeigt.<\/p>\n<p>Im Datenbankentwurf w&uuml;rde man hier nun eine Tabelle namens <b>tblPersonen <\/b>erstellen und f&uuml;r die jeweiligen Spezialisierungen Tabellen wie <b>tblKunden <\/b>oder <b>tblMitarbeiter<\/b>. Diese w&uuml;rden dann per 1:1-Beziehung miteinander verkn&uuml;pft werden, damit nicht etwa die Daten eines Datensatzes der Tabelle <b>tblKunden <\/b>mehreren Datens&auml;tzen der Tabelle <b>tblPersonen <\/b>zugeordnet werden k&ouml;nnen und umgekehrt. Das Ergebnis s&auml;he dann etwa in einer Access-Datenbank wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_16_001.png\" alt=\"Spezialisierung in einem Datenmodell\" width=\"425\" height=\"369,1067\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Spezialisierung in einem Datenmodell<\/span><\/b><\/p>\n<p>In der objektorierten Programmierung sieht es &auml;hnlich aus: Auch hier k&ouml;nnten Sie nat&uuml;rlich eine Klasse entwerfen, die sowohl die Basisdaten einer Person aufnehmen als auch die speziellen Daten f&uuml;r Mitarbeiter oder Kunden. Allerdings wird es dann schwer, bei der Programmierung immer nur genau die f&uuml;r den jeweiligen Typ g&uuml;ltigen Eigenschaften und Methoden zu nutzen, wenn immer alle Member etwa per IntelliSense angeboten werden.<\/p>\n<p>Eine Alternative w&auml;re es, jeweils eine Klasse f&uuml;r die Kunden und eine f&uuml;r die Mitarbeiter zu erstellen. Dabei w&uuml;rden beide jedoch eine Reihe identischer Eigenschaften enthalten wie zum Beispiel <b>Vorname <\/b>und <b>Nachname<\/b>. Und vielleicht gibt es auch noch Methoden, die Sie in beiden Klassen implementieren w&uuml;rden &#8211; wie etwa <b>GeburtstagskarteSchicken<\/b>. Diese m&uuml;ssten Sie dann erstens doppelt anlegen und zweitens &Auml;nderungen immer direkt in zwei Klassen durchf&uuml;hren.<\/p>\n<p>Und hier kommt die Vererbung ins Spiel &#8211; auch die Ableitung von Klassen genannt: Sie erstellen dabei genau wie bei der Basistabelle f&uuml;r die Personendaten erst einmal eine Basisklasse etwa namens <b>Person<\/b>. Diese stellt Eigenschaften bereit, mit denen Sie Daten wie <b>Vorname <\/b>oder <b>Nachname <\/b>einstellen k&ouml;nnen.<\/p>\n<p>Wenn Sie nun einen Kunden anlegen m&ouml;chten, ben&ouml;tigen Sie eine weitere Klasse: n&auml;mlich eine solche, die von der Klasse Person erbt beziehungsweise davon abgeleitet ist und die zus&auml;tzlich die f&uuml;r einen Kunden spezifischen Eigenschaften und Methoden hinzuf&uuml;gt. Diese wollen wir schlicht <b>Kunde <\/b>nennen. Das Gleiche erledigen wir f&uuml;r die spezielle Auspr&auml;gung einer Person namens Mitarbeiter &#8211; wir legen eine neue Klasse namens <b>Mitarbeiter <\/b>an, die von der Klasse <b>Person <\/b>erbt und ihre eigenen Eigenschaften und Methoden beisteuert.<\/p>\n<h2>Vererbung programmieren<\/h2>\n<p>Wir wollen uns an den Beispielfeldern der Tabellen aus dem obigen Datenbankbeispiel orientieren und entsprechende Klassen erstellen.<\/p>\n<p>Wir ben&ouml;tigen also zun&auml;chst die Klasse <b>Person<\/b>, die wir wie folgt in der Datei <b>Program.cs <\/b>anlegen:<\/p>\n<pre>class Person {\r\n     public string Vorname { get; set; }\r\n     public string Nachname { get; set; }\r\n}<\/pre>\n<p>Das ist die Kurzfassung, wenn Sie die Eigenschaften <b>Vorname <\/b>und <b>Nachname <\/b>nur lesen und schreiben m&ouml;chten, aber kein weiterer Zugriff auf die Werte erforderlich ist. Wenn Sie beispielsweise in einer Eigenschaft namens Bezeichnung den <b>Vornamen <\/b>und den <b>Nachnamen <\/b>zusammengesetzt zur&uuml;ckgeben wollen, m&uuml;ssen Sie folgende Klassendefinition verwenden:<\/p>\n<pre>class Person {\r\n     private string vorname;\r\n     private string nachname;\r\n     public string Vorname { \r\n         get {\r\n             return vorname;     \r\n         }\r\n         set {\r\n             vorname = value;\r\n         } \r\n     }\r\n     public string Nachname {\r\n         get {\r\n             return nachname;\r\n         }\r\n         set {\r\n             nachname = value;\r\n         }\r\n     }\r\n     public string Bezeichnung {\r\n         get {\r\n             return vorname + \" \" + nachname;\r\n         }\r\n     }\r\n}<\/pre>\n<p>Hier gibt es also interne Variablen namens <b>vorname <\/b>und <b>nachname<\/b>, welche die &uuml;ber die Eigenschaften <b>Vorname <\/b>und <b>Nachname <\/b>&uuml;bergebenen Daten speichern. F&uuml;r beide Eigenschaften legen wir jeweils einen <b>get<\/b>&#8211; und einen <b>set<\/b>-Block an, der &uuml;bergebene Werte in der entsprechenden Variablen speichert oder diesen wieder herausgibt. Die dritte Eigenschaft hei&szlig;t <b>Bezeichnung <\/b>und soll eine aus den Inhalten von <b>vorname <\/b>und <b>nachname <\/b>zusammengesetzte Zeichenkette zur&uuml;ckliefern.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000\"><a style=\"color: #ff0000\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000016\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000016?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000016\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"08e24e6614\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eines der wichtigsten Merkmale der objektorientierten Programmierung ist die Vererbung. Dank der Vererbung kann man f&uuml;r ein Objekt eine Basisklasse erstellen, die grundlegende Eigenschaften und Methoden f&uuml;r dieses Objekt bereitstellt. Ben&ouml;tigen Sie nun ein weiteres Objekt, das auf dem ersten Objekt aufbaut, aber weitere oder ge&auml;nderte Eigenschaften und Methoden enth&auml;lt, m&uuml;ssten Sie ohne Vererbung die gleiche Klasse nochmal erstellen und nach ihren W&uuml;nschen anpassen. Dank Vererbung brauchen Sie in der Klasse f&uuml;r das neue Objekt jedoch nur die Erweiterungen und &Auml;nderungen zu definieren. Den Rest verwenden Sie von der ersten Klasse &#8211; und brauchen eine Menge Code nur an einer Stelle zu warten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022015,662015,44000009,44000023,44000036],"tags":[],"yst_prominent_words":[66062022,66062051,66062047,66062041,66062043],"class_list":["post-55000016","post","type-post","status-publish","format-standard","hentry","category-66022015","category-662015","category-CProgrammiertechnik","category-PowerApps","category-Ribbon_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000016","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000016"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000016\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000016"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000016"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000016"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000016"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}