<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>VB.Net</title>
        <link>http://blogs.escde.net/jochen/category/8.aspx</link>
        <description>VB.Net</description>
        <language>en-US</language>
        <copyright>Jochen</copyright>
        <managingEditor>schimmel@escde.net</managingEditor>
        <generator>Subtext Version 1.9.3.0</generator>
        <item>
            <title>Schattenpolymorphie</title>
            <link>http://blogs.escde.net/jochen/archive/2006/09/08/47.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Seit Version 6.0 hat sich Visual Basic deutlich weiterentwickelt. Hierbei fällt einem vor allem die nun (endlich) richtige Objektorientierung auf. &lt;/p&gt;&lt;p&gt;Inzwischen dürften wohl die meisten Visual Basic (2005) Programmierer mit den grundlegenden Mechanismen der Objektorientierung - Kapselung, Vererbung und Polymorphie - vertraut sein. Aber es gibt noch einige wenig bekannte Mechanismen, welche in Ausnahmesituationen recht hilfreich sein können. &lt;/p&gt;&lt;p&gt;Ein solcher Mechanismus ist "Shadowing". Stellen Sie sich vor, Sie haben eine Klasse A, welche eine Methode "Method()" enthällt. Der Aufruf von Method() erzeugt folgende Ausgabe: &lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse A!" &lt;/p&gt;&lt;p&gt;Der passende Code würde so aussehen:&lt;br /&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ddb442b1-f8ff-4f1b-b6d6-6ae48158a927" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Overridable&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod()
       Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Eine Nachricht von Klasse A!&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nun schreiben Sie eine weitere Klasse namens B, welche von A erbt. Sie überschreiben die Methode "Method()", so dass diese nun folgende Ausgabe vornimmt:
&lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse B!"
&lt;/p&gt;&lt;p&gt;Diese würde wie folgt aussehen:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6d9d2a4b-6a6b-4949-a984-886ae303cb35" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; B : &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Inherits&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Overrides&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod()
        Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Eine Nachricht von Klasse B!&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nun könten Sie folgendes tun:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e5c36ffc-5ef2-498b-befc-359b7e286e00" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; a &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
a.Method()

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; b &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; B
b.Method()

a &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; b
a.Method()&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Die Ausgabe wäre dank Polymorphie folgende:
&lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse A!"&lt;br /&gt;"Eine Nachricht von Klasse B!"&lt;br /&gt;"Eine Nachricht von Klasse B!"
&lt;/p&gt;&lt;p&gt;Was aber, wenn Sie möchten, dass sich ein Objekt sich wie der Typ verhällt, den die darauf zeigende Referenz hat? Hierzu können Sie sich des "Shadows" Schlüsselwortes bedienen. Schreiben Sie hierzu die Klasse B wie folgt:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2f7a14b3-45e2-4dcf-99e7-53ed91b9fe99" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; B : &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Inherits&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Shadows&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod()
        Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Eine Nachricht von Klasse B!&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Die Ausgabe des Testcodes sieht nun wie folgt aus:
&lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse A!"&lt;br /&gt;"Eine Nachricht von Klasse B!"&lt;br /&gt;"Eine Nachricht von Klasse A!"
&lt;/p&gt;&lt;p&gt;Shadows bewirkt also, das bei Methodenaufrufen durch eine "A"-Referenz, die Methode der A-Klasse aufgerufen wird, während bei einer "B"-Referenz die Methode von B genommen wird. Man könnte Shadows sozusagen auch als "Antipolymorphie" bezeichnen.
&lt;/p&gt;&lt;p&gt;Nun, wann braucht man Shadows? Eigentlich sollte man es gar nicht benötigen, wenn Sie Shadows ernsthaft nutzen deutet dies meist auf einen Design-Fehler hin.
&lt;/p&gt;&lt;p&gt;Allerdings gibt es einige wenige Situationen, in denen es sich durchaus als nützlich erweist. Stellen Sie sich vor, Sie entwickeln ein Control, welches andere Entwickler via Visual Studio Designer auf ein Form ziehen können. Anschließend kann der Entwickler via Properties Window die Eigenschaften des Controls bearbeiten.&lt;br /&gt;Nun kann es passieren, dass dieses Control im Properties Window Eigenschaften anbietet, welche es von einer Basisklasse geerbt hat. Sie möchten diese dem Entwickler in Ihrem Control aber nicht anbieten. Durch Shadows können Sie solche Eigenschaften "verstecken", indem Sie beispielsweise das [Browsable(false)] Attribut anhängen.
&lt;/p&gt;&lt;p&gt;An diesem Beispiel erkennt man aber schon, dass Shadows eher in Randsituationen benötigt wird und nicht in einem ordentlichen, objektorientierten Entwurf. Hier sollten Sie wirklich Abstand von der "dunklen Seite der Polymorphie" halten...&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/47.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2006/09/08/47.aspx</guid>
            <pubDate>Fri, 08 Sep 2006 08:17:34 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/47.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2006/09/08/47.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/47.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/47.aspx</trackback:ping>
        </item>
        <item>
            <title>Das My Schl&amp;uuml;sselwort in Visual Basic .NET</title>
            <link>http://blogs.escde.net/jochen/archive/2006/09/05/46.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Zum Leidwesen von Microsoft hat sich herausgestellt, dass extrem viele Visual Basic Programmierer den Sprung nach .NET verpasst haben. Die meisten hiervon absichtlich. Der Grund? Visual Basic .NET ist zu kompliziert, der Umstieg auf das (im Vergleich zur VB Runtime) komplexere .NET Framework dauert zu lange und lohnt sich nicht.  &lt;/p&gt;&lt;p&gt;Mit Visual Basic 2005 will Microsoft dies ändern und die Stärke des "alten VB" wieder in den Vordergrund stellen: Einfachheit.  &lt;/p&gt;&lt;p&gt;Ein großes Problem bei .NET stellen (für Visual Basic Veteranen) die vielen verschachtelten Namespaces dar. Unter Visual Basic 5/6 gab es eine Handvoll von Namespaces, oder sagen wir lieber "Gruppen", in denen eingentlich die komplette VB-Runtime Platz fand und trotzdem nicht unübersichtlich wurde.  &lt;/p&gt;&lt;p&gt;Aber auch die nun erzwungene und Lehrbuch-konforme Objektorientierung stößt bei vielen "VBlern" auf Unverständniss. Erinnen Sie sich an die Forms aus VB 5/6? Klassen waren das ja eigentlich nicht wirklich, von der Verwendung her eher Objekte... aber naja... mehrere Instanzen konnte man dann ja doch erstellen und überhaupt... es war irgendwie komisch, aber funktioniert hat's trotzdem... Nur verständlich dass der Umstieg auf UML-konforme Objektorientierung da ein Problem darstellt.  &lt;/p&gt;&lt;p&gt;"Was machen wir nun, um aus dieser Kiste wieder heil herauszukommen?", dachten sich nun die VB-Designer bei Microsoft. Und die Lösung heißt "My".  &lt;/p&gt;&lt;p&gt;My wenn Sie "My" gefolgt von "." in Visual Studio 2005 eintippen begrüßt Sie ein IntellySense Fenster, welches erst mal vermuten läßt, dass es sich bei My um einen Namepspace handelt. Ist es eigentlich auch! My soll die wichtigsten Funktionen aus dem .NET Framework herauspicken und zentral zur Verfügung stellen. Sie finden in My wiederum Namespaces wie z.B.:  &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Application  &lt;/li&gt;&lt;li&gt;Computer  &lt;/li&gt;&lt;li&gt;Settings  &lt;/li&gt;&lt;li&gt;User &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;und einige mehr. Diese Namespaces fassen einige der wichtigsten Funktionen und Klassen kurz zusammen, um diese ohne große Umwege zugänglich zu machen.  &lt;/p&gt;&lt;p&gt;Sie möchten zum Beispiel auf den aktuell angemeldeten Benutzernamen zugreifen können? Kein Problem:  &lt;/p&gt;&lt;p&gt;My.User.Name  &lt;/p&gt;&lt;p&gt;Einfacher ging's auch mit dem alten VB nicht...  &lt;/p&gt;&lt;p&gt;Und um nochmal auf die Forms zurückzukommen: Ihre Fenster finden Sie jetzt alle direkt unter My.Forms. Das erinnert schon ein wenig an frühere Visual Basic Anwendungen, oder?&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/46.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2006/09/05/46.aspx</guid>
            <pubDate>Tue, 05 Sep 2006 14:21:34 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/46.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2006/09/05/46.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/46.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/46.aspx</trackback:ping>
        </item>
    </channel>
</rss>