{"id":55000010,"date":"2015-02-01T00:00:00","date_gmt":"2020-08-25T08:43:20","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=10"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Objektorientierte_Programmierung_Teil_1","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Objektorientierte_Programmierung_Teil_1\/","title":{"rendered":"Objektorientierte Programmierung, Teil 1"},"content":{"rendered":"<p><b>Wer mit VBA programmiert, nutzt eigentlich schon eine Reihe der Elemente der objektorientierten Programmierung &#8211; zum Beispiel, wenn er Objekte auf Basis der Klasse Database oder Recordset erstellt und dann mit deren Methoden und Eigenschaften durch die Daten einer Tabelle navigiert. Auch benutzerdefinierte Klassen lassen sich mit VBA erstellen. Unter C# erhalten Sie jedoch Zugriff auf den kompletten Umfang der objektorientierten Programmierung. Dieser Artikel liefert einen Einstieg in die objektorientierte Programmierung mit C#.<\/b><\/p>\n<p><b>Prozeduren starten ade<\/b><\/p>\n<p>Eines m&uuml;ssen wir direkt klarstellen: Einfach mal eben wie im VBA-Editor eine Prozedur in einem Standardmodul programmieren und diese mit <b>F5 <\/b>ausf&uuml;hren &#8211; das gelingt in Visual Studio unter C# nicht. Dort m&uuml;ssen Sie etwa in einer Konsolenanwendung zumindest die standardm&auml;&szlig;ig vorhandene Klasse verwenden, die dort enthaltene Prozedur <b>Main<\/b> mit den gew&uuml;nschten Codezeilen f&uuml;llen und auf <b>F5 <\/b>dr&uuml;cken.<\/p>\n<p><b>Die Klasse Program<\/b><\/p>\n<p>Wenn Sie ein neues Projekt auf Basis der Vorlage <b>Konsolenanwendung <\/b>erstellen, erhalten Sie eine Datei mit einer Klasse namens <b>Program <\/b>mit einer Methode namens <b>Main<\/b>, die standardm&auml;&szlig;ig beim Start der Anwendung ausgef&uuml;hrt wird.<\/p>\n<p>Von der Methode <b>Main <\/b>aus werden wir gleich starten, um unsere erste selbst erstellte Klasse zu instanzieren und zu nutzen.<\/p>\n<p><b>Eine Klasse pro Datei<\/b><\/p>\n<p>Jede Klasse sollte in einer eigenen Datei erstellt werden, um die &Uuml;bersicht zu gew&auml;hrleisten. Sollten Sie mehrere Klassen in einer Datei anlegen, finden Sie solche Klassen, deren Name sich von dem der Datei unterscheidet, nicht mehr so schnell &uuml;ber den Projektmappen-Explorer wieder.<\/p>\n<p><b>Neue Klasse erstellen<\/b><\/p>\n<p>Dementsprechend beginnen wir nun, indem wir eine neue Klasse erstellen. Dies erledigen wir &uuml;ber den Men&uuml;eintrag <b>Projekt|Klasse hinzuf&uuml;gen&#8230; <\/b>Dies &ouml;ffnet den Dialog <b>Neues Element <\/b>hinzuf&uuml;gen und stellt die Vorlage direkt auf den Eintrag <b>Klasse <\/b>ein. Wir nennen die Klasse <b>Konto<\/b> und klicken dann auf Hinzuf&uuml;gen (siehe Bild 1). Alternativ &ouml;ffnen Sie den Dialog <b>Neues Element <\/b>mit dem Kontextmen&uuml;-Eintrag <b>Hinzuf&uuml;gen|Klasse&#8230; <\/b>des Eintrags f&uuml;r das Projekt im Projektmappen-Explorer.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_10_001.png\" alt=\"Hinzuf&uuml;gen einer neuen Klasse\" width=\"650\" height=\"340,9091\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen einer neuen Klasse<\/span><\/b><\/p>\n<p>Die neue Klasse erscheint nun sowohl im Projektmappen-Explorer als auch mit dem vollst&auml;ndigen Quellcode im Code-Fenster (siehe Bild 2). Abgesehen von den <b>using<\/b>-Anweisungen, dem <b>namespace<\/b>&#8211; und dem <b>class<\/b>-Element ist die Klasse noch jungfr&auml;ulich:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_10_002.png\" alt=\"Die neue, noch unber&uuml;hrte Klasse Konto\" width=\"500\" height=\"259,8214\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die neue, noch unber&uuml;hrte Klasse Konto<\/span><\/b><\/p>\n<pre>namespace OOProgrammierung {\r\n     class Konto {\r\n     }\r\n}<\/pre>\n<p><b>Benennung<\/b><\/p>\n<p>Der Klassenname sollte m&ouml;glichst genau beschreiben, welchem Objekt der Realit&auml;t die Klasse entspricht &#8211; sofern dies gegeben ist. Soll die Klasse eine Person aufnehmen, hei&szlig;t sie <b>Person<\/b>, soll sie wie in unserem Fall ein Konto aufnehmen, lautet der Klassenname <b>Konto<\/b>.<\/p>\n<p>Wir verwenden kein Pr&auml;fix, au&szlig;erdem beginnt der Klassenname mit einem Gro&szlig;buchstaben. Besteht der Klassenname aus mehreren zusammengesetzten W&ouml;rtern, sollten auch die folgenden W&ouml;rter jeweils wieder gro&szlig; geschrieben werden.<\/p>\n<p>Wenn Sie den Namen der Datei mit der Klasse sp&auml;ter noch einmal &auml;ndern m&ouml;chten, erledigen Sie da am besten &uuml;ber den Projektmappen-Explorer. Visual Studio &auml;ndert dann optional alle Verweise auf diese Klasse. Wenn Sie den Dateinamen <b>Konto <\/b>in <b>Bankkonto <\/b>&auml;ndern, benennt Visual Studio auch automatisch die Klasse im Code um.<\/p>\n<p><b>Objekt instanzieren<\/b><\/p>\n<p>Die Klasse ist zwar noch leer (sie hat noch keine Methoden, Eigenschaften et cetera), aber wir k&ouml;nnen diese dennoch bereits deklarieren und auch instanzieren. Dazu wechseln Sie nun zur Klasse <b>Program<\/b>. Dort erweitern Sie die Methode <b>Main <\/b>um zwei Zeilen:<\/p>\n<pre>static void Main(string[] args) {\r\n     Konto konto;\r\n     konto = new Konto();\r\n}<\/pre>\n<p>Die erste Zeile deklariert ein neues Objekt namens <b>konto <\/b>mit dem Typ <b>Konto <\/b>(man beachte die Gro&szlig;-\/Kleinschreibung). Beides k&ouml;nnen Sie auch in einer einzigen Anweisung erledigen:<\/p>\n<pre>Konto konto = new Konto();<\/pre>\n<p>Die Deklaration reserviert den Speicher f&uuml;r das Objekt, die <b>new<\/b>-Anweisung erstellt das Objekt nach dem in der Klasse definierten Bauplan. Mit dem Objekt k&ouml;nnen wir nun noch nicht viel anfangen, da wir noch keine Methoden oder Eigenschaften hinzugef&uuml;gt haben.<\/p>\n<p>Sie k&ouml;nnen auch mehrere Objekte auf Basis der gleichen Klasse erstellen:<\/p>\n<pre>Konto konto1 = new Konto();\r\nKonto konto2 = new Konto();<\/pre>\n<p><b>Sichtbarkeit der Klasse<\/b><\/p>\n<p>Wenn Sie mit Access gearbeitet haben, kennen Sie die Klassenbibliotheken, die Sie &uuml;blicherweise per Verweis in ein VBA-Projekt eingebunden haben. Diese haben dann, sowohl &uuml;ber den Objektkatalog einsehbare als auch im Code referenzierbare Klassen bereitgestellt. Wenn Sie eine Klasse in einem C#-Projekt erstellen, um von anderen Anwendung darauf zuzugreifen, m&uuml;ssen Sie die Deklaration dieser Klasse mit dem Schl&uuml;sselwort <b>public <\/b>versehen:<\/p>\n<pre>     public class Konto {\r\n     }<\/pre>\n<p>Wenn Sie das Schl&uuml;sselwort <b>public <\/b>nicht angeben, verwendet die Klasse die Standardeinstellung, welche dem Einsatz des Schl&uuml;sselworts <b>internal <\/b>entspricht und den Zugriff von au&szlig;erhalb der Klassenbibliothek verwehrt.<\/p>\n<p><b>Objekt freigeben<\/b><\/p>\n<p>Objekte belegen Arbeitsspeicher. Unter VBA haben Sie eine Objektvariable durch Setzen auf den Wert <b>Nothing <\/b>freigegeben:<\/p>\n<pre>VBA-Code:\r\n<span style=\"color:blue;\">Set<\/span> rst = Nothing<\/pre>\n<p>Unter C# stellen Sie das Objekt auf den Wert <b>null <\/b>ein:<\/p>\n<pre>konto = null;<\/pre>\n<p>Damit k&ouml;nnen Sie nun nicht mehr auf das Objekt zugreifen. Der Speicherplatz wird jedoch erst freigegeben, wenn die Garbage Collection startet und das Objekt l&ouml;scht. Dies geschieht je nach Auslastung (bei hoher Auslastung seltener) und verf&uuml;gbarem Speicherplatz (wenn der Platz knapp wird) oder bei Schlie&szlig;en der Anwendung.<\/p>\n<p><b>Eigenschaften einer Klasse<\/b><\/p>\n<p>Unsere Konto-Klasse soll verschiedene Eigenschaften bieten, zum Beispiel <b>Kontoinhaber<\/b>, <b>Bankleitzahl<\/b>, <b>Kontonummer<\/b>, <b>Kontostand <\/b>und <b>Dispositionsrahmen<\/b>. Um diese Eigenschaften nach dem Instanzieren eines Objekts auf Basis der Klasse <b>Konto <\/b>zu lesen und auch zu schreiben, deklarieren Sie diese wie folgt:<\/p>\n<pre>class Konto {\r\n     public string Kontoinhaber;\r\n     public string Kontonummer;\r\n     public string Bankleitzahl;\r\n     public decimal Kontostand;\r\n     public decimal Dispositionsrahmen;\r\n}<\/pre>\n<p>Sie k&ouml;nnen dann von einer anderen Klasse aus, in diesem Fall <b>Program<\/b>, per IntelliSense auf die Eigenschaften zugreifen (siehe Bild 3). Dort sehen Sie noch einige weitere Methoden, beispielsweise <b>Equals <\/b>oder <b>GetType<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_10_003.png\" alt=\"Eigenschaften per IntelliSense\" width=\"425\" height=\"483,0488\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Eigenschaften per IntelliSense<\/span><\/b><\/p>\n<p><b>Eigenschaften zuweisen und ausgeben<\/b><\/p>\n<p>Das folgende Beispiel deklariert und instanziert das Objekt <b>konto<\/b> auf Basis der Klasse <b>Konto<\/b>, weist den Eigenschaften Werte zu und gibt diese dann in der Konsole aus:<\/p>\n<pre>Konto konto;\r\nkonto = new Konto();\r\nkonto.Kontoinhaber = \"Andr&eacute; Minhorst\";\r\nkonto.Kontonummer = \"1234567890\";\r\nkonto.Bankleitzahl = \"87654321\";\r\nkonto.Kontostand = 100;\r\nkonto.Dispositionsrahmen = 1000;\r\nConsole.WriteLine(\"Kontoinhaber: {0}\", konto.Kontoinhaber);\r\nConsole.WriteLine(\"Kontonummer:  {0}\", konto.Kontonummer);\r\nConsole.WriteLine(\"Bankleitzahl: {0}\", konto.Bankleitzahl);\r\nConsole.ReadLine();<\/pre>\n<p><b>Datenkapselung<\/b><\/p>\n<p>Von VBA kennen Sie es vielleicht bereits: Die Eigenschaften einer Klasse werden nie als &ouml;ffentliche Variablen deklariert, sondern mit den Schl&uuml;sselwort <b>Private<\/b>. Stattdessen erstellen Sie sogenannte <b>Property Get<\/b>&#8211; und <b>Property Let<\/b>&#8211; (f&uuml;r Werttypen) oder <b>Property Set<\/b>-Methoden (f&uuml;r Referenztypen), um auf die Inhalte der jeweiligen Variablen zuzugreifen. Hier haben wir dann zun&auml;chst eine private Variable f&uuml;r den Wert der Eigenschaft deklariert:<\/p>\n<pre>'VBA-Code:\r\n<span style=\"color:blue;\">Private <\/span>m_Kontostand<span style=\"color:blue;\"> As Currency<\/span><\/pre>\n<p>Die <b>Property Let<\/b>-Methode erlaubte dann das Setzen des Wertes dieser Variablen von au&szlig;erhalb der Klasse:<\/p>\n<pre>'VBA-Code:\r\n<span style=\"color:blue;\">Public Property Let <\/span>Kontostand(curKontostand<span style=\"color:blue;\"> As Currency<\/span>)\r\n     m_Kontostand = curKontostand\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Mit der <b>Get<\/b>-Methode konnte man den Wert hingegen lesen:<\/p>\n<pre>'VBA-Code:\r\n<span style=\"color:blue;\">Public Property Get <\/span>Kontostand<span style=\"color:blue;\"> As Currency<\/span>\r\n     Kontostand = m_Kontostand\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Durch diese Methoden war es m&ouml;glich, beispielsweise Eingaben auf ihre G&uuml;ltigkeit hin zu pr&uuml;fen. Unter C# sieht das &auml;hnlich aus, allerdings ist der Aufbau etwas anders. Die Deklaration &auml;ndern wir, indem wir das Schl&uuml;sselwort <b>public<\/b> auf <b>private <\/b>&auml;ndern. Au&szlig;erdem soll die Schreibweise mit dem gro&szlig;en Anfangsbuchstaben f&uuml;r die Eigenschaft nach au&szlig;en hin erkennbar sein. Das hei&szlig;t, dass wir den Namen der Variablen &auml;ndern m&uuml;ssen &#8211; Namen f&uuml;r Variablen, Methoden, Eigenschaften et cetera m&uuml;ssen innerhalb eines Namespaces eindeutig sein.<\/p>\n<p>Also &auml;ndern wir beim Variablennamen den gro&szlig;en Anfangsbuchstaben in einen kleinen:<\/p>\n<pre>private string kontoinhaber;<\/pre>\n<p>Wenn Sie dies zu un&uuml;bersichtlich finden, k&ouml;nnen Sie alternativ auch etwa den Namen mit Gro&szlig;buchstaben verwenden und diesem einen Unterstrich voranstellen &#8211; also etwa <b>_Kontoinhaber<\/b>. Au&szlig;erdem f&uuml;gen wir eine &ouml;ffentliche Eigenschaft mit einem <b>get<\/b>&#8211; und einem <b>set<\/b>-Block hinzu. Diese wird wieder mit gro&szlig;em Anfangsbuchstaben notiert:<\/p>\n<pre>public string Kontoinhaber {\r\n     get {\r\n         return kontoinhaber;\r\n     }\r\n     set {\r\n         kontoinhaber = value;           \r\n     }\r\n}<\/pre>\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\/55000010\/\">\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\/55000010?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<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000010\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"1f69832577\"\/>\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>Wer mit VBA programmiert, nutzt eigentlich schon eine Reihe der Elemente der objektorientierten Programmierung &#8211; zum Beispiel, wenn er Objekte auf Basis der Klasse Database oder Recordset erstellt und dann mit deren Methoden und Eigenschaften durch die Daten einer Tabelle navigiert. Auch benutzerdefinierte Klassen lassen sich mit VBA erstellen. Unter C# erhalten Sie jedoch Zugriff auf den kompletten Umfang der objektorientierten Programmierung. Dieser Artikel liefert einen Einstieg in die objektorientierte Programmierung mit C#.<\/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":[66012015,662015,44000009,44000023],"tags":[],"yst_prominent_words":[66062073,66062075,66062065,66062049,66062057,66062069,66062045,66062077,66062051,66062047,66062067,66062059,66062063,66062062,66062053,66062071,66062041,66062055,66062043,66062061],"class_list":["post-55000010","post","type-post","status-publish","format-standard","hentry","category-66012015","category-662015","category-CProgrammiertechnik","category-PowerApps"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000010","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=55000010"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000010\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000010"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}