Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einführung
2 Grundlagen der Sprachsyntax
3 Klassendesign
4 Weitere Datentypen
5 Multithreading
6 Collections und LINQ
7 Eingabe und Ausgabe
8 Anwendungen: Struktur und Installation
9 Code erstellen und debuggen
10 Einige Basisklassen
11 Windows-Anwendungen erstellen
12 Die wichtigsten Steuerelemente
13 Tastatur- und Mausereignisse
14 MDI-Anwendungen
15 Grafiken mit GDI+
16 Drucken
17 Entwickeln von Steuerelementen
18 Programmiertechniken
19 WPF – Grundlagen
20 Layoutcontainer
21 WPF-Steuerelemente
22 Konzepte von WPF
23 Datenbankverbindung mit ADO.NET
24 Datenbankabfragen mit ADO.NET
25 DataAdapter
26 Offline mit DataSet
27 Datenbanken aktualisieren
28 Stark typisierte DataSets
A Anhang: Einige Übersichten
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual Basic 2008 von Andreas Kuehnel, Stephan Leibbrandt
Das umfassende Handbuch
Buch: Visual Basic 2008

Visual Basic 2008
3., aktualisierte und erweiterte Auflage, geb., mit DVD
1.323 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1171-0
Pfeil 3 Klassendesign
Pfeil 3.1 Objektorientierung
Pfeil 3.1.1 Einführung
Pfeil 3.1.2 Vorteile
Pfeil 3.1.3 Klassenimplementierung in .NET
Pfeil 3.1.4 Klassen in Visual Basic
Pfeil 3.1.5 Projekttyp »Klassenbibliothek«
Pfeil 3.1.6 Bemerkung zu den Codefragmenten
Pfeil 3.1.7 Objekte durch New
Pfeil 3.1.8 Ausnahmen mit Throw auslösen
Pfeil 3.1.9 Datentypen
Pfeil 3.1.10 Sichtbarkeit der Klasse
Pfeil 3.1.11 Aufteilung der Definition mit Partial
Pfeil 3.1.12 Grafikbibliothek: Beispiel für Kapitel 3 und 4
Pfeil 3.2 Kapselung
Pfeil 3.2.1 Kombinationen
Pfeil 3.2.2 Private
Pfeil 3.2.3 Sichtbarkeitsmodifikatoren
Pfeil 3.2.4 Lokale Variablen
Pfeil 3.2.5 Softwareschutz
Pfeil 3.2.6 Grafikbibliothek: private Größe des Rechtecks
Pfeil 3.3 Verhalten (Methoden)
Pfeil 3.3.1 Prinzip
Pfeil 3.3.2 Verlassen der Methode
Pfeil 3.3.3 Parameter
Pfeil 3.3.4 Überladung (Overloads)
Pfeil 3.3.5 Rückgabewert
Pfeil 3.3.6 Reine Deklaration mit Partial
Pfeil 3.3.7 Grafikbibliothek: Zugriffsmethoden auf die Größe des Rechtecks
Pfeil 3.4 Bindung
Pfeil 3.4.1 Klassenbindung mit Shared
Pfeil 3.4.2 Klassenkonstruktoren
Pfeil 3.4.3 Externe Funktionen
Pfeil 3.4.4 Grafikbibliothek: Rechteckübergreifendes
Pfeil 3.5 Objektinitialisierung mit Konstruktoren
Pfeil 3.5.1 Objektkonstruktoren
Pfeil 3.5.2 Nichtöffentliche Konstrukturen
Pfeil 3.5.3 Grafikbibliothek: Initialisierung des Rechtecks
Pfeil 3.6 Zustände (Felder)
Pfeil 3.6.1 Deklaration und Initialisierung
Pfeil 3.6.2 Sichtbarkeit
Pfeil 3.6.3 Konstanten: ReadOnly und Const
Pfeil 3.6.4 With
Pfeil 3.6.5 Grafikbibliothek: Konstanten des Rechtecks
Pfeil 3.7 Eigenschaften
Pfeil 3.7.1 Kontrolle beim Aufrufer
Pfeil 3.7.2 Zugriffsmethoden
Pfeil 3.7.3 Getter und Setter: Property
Pfeil 3.7.4 Indexer
Pfeil 3.7.5 Standardeigenschaft: Default
Pfeil 3.7.6 Schreibschutz und Leseschutz: ReadOnly und WriteOnly
Pfeil 3.7.7 Sichtbarkeit
Pfeil 3.7.8 Klammern
Pfeil 3.7.9 Grafikbibliothek: Eigenschaften des Rechtecks
Pfeil 3.8 Innere Klassen
Pfeil 3.8.1 Beziehung zur äußeren Klasse
Pfeil 3.8.2 Sichtbarkeit
Pfeil 3.8.3 Grafikbibliothek: Position des Rechtecks
Pfeil 3.9 Dynamisches Verhalten: Delegate und Function
Pfeil 3.9.1 Funktionszeiger: Delegates
Pfeil 3.9.2 Automatisch generierter Code
Pfeil 3.9.3 Mehrere Aktionen gleichzeitig
Pfeil 3.9.4 Asynchrone Aufrufe
Pfeil 3.9.5 Funktionsobjekte: Function (λ-Ausdrücke)
Pfeil 3.9.6 Umwandlungen
Pfeil 3.9.7 Grafikbibliothek: Vergleich von Rechtecken
Pfeil 3.10 Ereignisse
Pfeil 3.10.1 Ereignis: Event und RaiseEvent
Pfeil 3.10.2 Statische Methodenbindung WithEvents und Handles
Pfeil 3.10.3 Dynamische Methodenbindung: AddHandler und RemoveHandler
Pfeil 3.10.4 Benutzerdefinierte Ereignisse: Custom Event
Pfeil 3.10.5 Umwandlungen
Pfeil 3.10.6 Grafikbibliothek: Größenänderungen von Rechtecken überwachen
Pfeil 3.11 Benutzerdefinierte Operatoren
Pfeil 3.11.1 Prinzip
Pfeil 3.11.2 Überladung
Pfeil 3.11.3 Vergleich
Pfeil 3.11.4 Typumwandlung mit CType: Widening und Narrowing
Pfeil 3.11.5 Wahrheitswerte: IsTrue und IsFalse
Pfeil 3.11.6 Grafikbibliothek: Addition und Umwandlung von Rechtecken
Pfeil 3.12 Alle Klassenelemente
Pfeil 3.12.1 Der Namensraum My
Pfeil 3.13 Vererbung
Pfeil 3.13.1 Klassenbeziehung durch Inherits
Pfeil 3.13.2 Sichtbarkeitsmodifikatoren
Pfeil 3.13.3 Zugriff auf Eltern mit MyBase
Pfeil 3.13.4 Modifikation: Shadows und Overloads (Overrides)
Pfeil 3.13.5 Abstrakte Klassen: MustInherit und MustOverride
Pfeil 3.13.6 Spezifische Catch-Blöcke
Pfeil 3.13.7 Eigene Ausnahmen
Pfeil 3.13.8 Arrays
Pfeil 3.13.9 Grafikbibliothek: neue Vielecke
Pfeil 3.14 Polymorphie
Pfeil 3.14.1 Virtuelle Methoden: Overridable und Overrides
Pfeil 3.14.2 Unterbrechen: Overloads, Shadows und Overrides
Pfeil 3.14.3 Unterbinden: NotInheritable, NotOverridable und MyClass
Pfeil 3.14.4 Konstruktoren
Pfeil 3.14.5 Equals
Pfeil 3.14.6 ToString
Pfeil 3.14.7 Grafikbibliothek: Objektsammlungen
Pfeil 3.15 Schnittstellen: Interface und Implements
Pfeil 3.15.1 Benennungen und Parameter
Pfeil 3.15.2 Schnittstellen und Vererbung
Pfeil 3.15.3 Schnittstellenvererbung
Pfeil 3.15.4 Schnittstelle oder abstrakte Klasse?
Pfeil 3.15.5 Grafikbibliothek: Flächen
Pfeil 3.16 Lebensende eines Objekts
Pfeil 3.16.1 Garbage Collector
Pfeil 3.16.2 Destruktoren
Pfeil 3.16.3 Dispose und Using


Rheinwerk Computing - Zum Seitenanfang

3.8 Innere Klassen Zur nächsten ÜberschriftZur vorigen Überschrift

Bisher haben wir uns mit »flachen« Klassen beschäftigt. Unter flach verstehe ich hier eine Klasse, die keine anderen Klassen enthält. In diesem Abschnitt betrachten wir den Fall, dass eine Klasse eine andere enthält. Auch die später im Buch beschriebenen Datentypen können in eine Klasse eingebettet sein und folgen den hier vorgestellten Konzepten. Lediglich der Typ Module kann nicht innerhalb eines anderen Datentyps stehen. Umgekehrt können fast alle Datentypen innere Datentypen enthalten (einzige Ausnahme: siehe Abschnitt 4.3, »Enumerationen«).

Klassen und andere Datentypen werden geschachtelt, um eine logische Beziehung zu der umgebenden Klasse oder einem anderen Typ zu unterstreichen. Es wird keine Verbindung zwischen Objekten geschaffen, lediglich die geschachtelten Datentypen hängen zusammen. So kann zum Beispiel eine Klasse Rad einmal in einer Auto-Klasse und eine andere davon unabhängig in einer Kutsche-Klasse stecken. Beide Räder sind recht unterschiedlich, und es ist zur Unterscheidung sinnvoll, den logischen Bezug zum Fahrzeugtyp herzustellen. Die Deklaration erfolgt analog zu einer ungeschachtelten Klasse. In der folgenden Syntax sind die Zeilenvorschübe zwingend, während optionale Teile in eckige Klammern gesetzt sind. Die Namen Außen und Innen sowie andere kursive Teile dürfen natürlich beliebig umbenannt werden.


[<Modifikatoren>] Class Außen 
  ... 
  [<Modifikatoren>] Class Innen 
  [<Effekte>] 
    [<Mitglieder>] 
  End Class 
  ... 
End Class


Hinweis
Statt Class können auch andere Datentypen stehen, die innere Typen erlauben.


Es gibt mehr Modifikatoren als in einer Klasse auf oberster Ebene. Wie Tabelle 3.11 zeigt, sind insbesondere bei der Sichtbarkeit alle für andere Klassenmitglieder erlaubten Spezifikationen möglich und nicht nur Friend und Public.


Tabelle 3.11 Modifikatoren eines inneren Datentyps

Art Beschreibung

Sichtbarkeit

Grad der Öffentlichkeit (siehe Abschnitt 3.2, »Kapselung«)

Redefinition

Art des Ersatzes oder Zwangs zu einer Definition (siehe Abschnitt 3.13, »Vererbung«)

Aufteilung

Definition an verschiedenen Orten (siehe Abschnitt 3.1.11, »Aufteilung der Definition mit Partial«)



Hinweis
Innere Datentypen sind implizit an den umgebenden Typ gebunden und weder brauchen noch dürfen sie mit Shared gekennzeichnet werden.


Die erlaubten Effekte sind dieselben wie für andere Klassen (siehe Tabelle 3.12). Bei anderen Datentypen als Klassen sind nicht immer alle erlaubt.


Tabelle 3.12 Effekte eines inneren Datentyps

Art Beschreibung

Implementation

Erfüllung einer Schnittstelle (siehe Abschnitt 3.15, »Schnittstellen: Interface und Implements«)

Vererbung

Aufbau auf anderer Klasse (siehe Abschnitt 3.13.1, »Klassenbeziehung durch Inherits«)


Der Zugriff auf einen inneren Datentyp erfolgt einfach über die Qualifikation mit dem Namen der äußeren Klasse. Beim Zugriff ist formell nicht zu unterscheiden, ob die Klasse Teil einer anderen ist oder in einem gleichlautenden Namensraum steckt (die Klassennamen sind beliebig).


<äußere Klasse>.<innere Klasse>

Das folgende Codefragment zeigt exemplarisch die Erzeugung einer Variablen vom Typ der inneren Klasse:

Dim var As Außen.Innen = New Außen.Innen()

Schauen wir uns nun das Ganze in einem Beispiel an. Es definiert eine Klasse Auto, in der eine Klasse Motor eingebettet ist.


'...\Klassendesign\InnereKlassen\Prinzip.vb

Option Explicit On 
Namespace Klassendesign

  Class Auto 
    Class Motor 
      Sub starten() 
        Console.WriteLine("Motor gestartet!") 
      End Sub 
    End Class 
  End Class

  Module Prinzip 
    Sub Test() 
      Dim motor As Auto.Motor = New Auto.Motor() 
      motor.starten() 
      Console.ReadLine() 
    End Sub 
  End Module 
End Namespace

Die Ausgabe bestätigt die korrekte Arbeitsweise:

Motor gestartet!

Außer der Objekterzeugung mit einem qualifizierten Namen ist nichts Besonderes an der Verwendung einer inneren Klasse.


Rheinwerk Computing - Zum Seitenanfang

3.8.1 Beziehung zur äußeren Klasse Zur nächsten ÜberschriftZur vorigen Überschrift

Die Einbettung einer Klasse in eine andere bezieht sich auch auf den Zugriff auf die sie umgebende Klasse. Die innere Klasse hat vollständigen direkten Zugriff auf alle Mitglieder der äußeren Klasse. Das nächste Codefragment definiert eine Klasse Schüler innerhalb von Schulklasse, die zwei private Felder hat. In der Prozedur Test() wird ein Schüler-Objekt geschaffen, und über die Methoden Auskunft() wird auf die Felder der Klasse Schulklasse zugegriffen. Da die Beziehung der Klassen keine Objektbeziehung darstellt, wird der zweiten Methode ein Schulklasse-Objekt übergeben, das die Objektbeziehung herstellt.


'...\Klassendesign\InnereKlassen\InnenNachAussen.vb

Option Explicit On 
Namespace Klassendesign

  Class Schulklasse 
    Private Shared name As String = "Crey" 
    Private spitzname As String = "Schnauz"

    Class Schüler 
      Sub Auskunft() 
        Console.WriteLine("Lehrer: {0}", name) 
      End Sub 
      Sub Auskunft(ByVal klasse As Schulklasse) 
        Console.WriteLine("Genannt: {0}", klasse.spitzname) 
      End Sub 
    End Class 
  End Class

  Module Hinein 
    Sub Test() 
      Dim pfeiffer As Schulklasse.Schüler = New Schulklasse.Schüler() 
      pfeiffer.Auskunft() 
      pfeiffer.Auskunft(New Schulklasse()) 
      Console.ReadLine() 
    End Sub 
  End Module 
End Namespace

Dass die auszugebenden Felder privat sind, behindert die innere Klasse nicht beim Zugriff.

Lehrer: Crey 
Genannt: Schnauz

In der anderen Richtung, das heißt von außen nach innen, bestehen keine Besonderheiten beim Zugriff. Daher wird das folgende Codefragment vom Compiler zurückgewiesen:

  Class Schulklasse 
    Sub Auskunft() 
      Dim pfeiffer As Schüler = New Schüler() 
      Console.WriteLine("Pfeiffer: {0}", pfeiffer.zustand) 'Fehler!! 
    End Sub 
    Class Schüler 
      Private zustand As String = "verliebt" 
    End Class 
  End Class

Da über den Quelltext keine Objektbeziehung zwischen innerer und äußerer Klasse hergestellt wird, bietet es sich an, diese über den Konstruktor der inneren Klasse zu erzwingen. Das nächste Codefragment erzwingt damit die Beziehung zwischen dem Flugzeug und der Turbine, indem nur ein parametrisierter Konstruktor existiert, der ein Flugzeug-Objekt entgegennimmt.


'...\Klassendesign\InnereKlassen\Objektbeziehung.vb

Option Explicit On 
Namespace Klassendesign 
  Class Flugzeug 
    Private name As String 
    Sub New(ByVal name As String) 
      Me.name = name 
    End Sub

    Class Turbine 
      Private flugzeug As Flugzeug 
      Private nr As Integer

      Sub New(ByVal flugzeug As Flugzeug, ByVal nr As Int32) 
        Me.flugzeug = flugzeug : Me.nr = nr 
      End Sub

      Sub Auskunft() 
        Console.WriteLine("Turbine {0} in Flugzeug {1}", nr, flugzeug.name) 
      End Sub 
    End Class 
  End Class

  Module Beziehung 
    Sub Test() 
      Dim flug As Flugzeug = New Flugzeug("A380") 
      Dim turb As Flugzeug.Turbine 
      turb = New Flugzeug.Turbine(flug, 3) 
      turb.Auskunft() 
      Console.ReadLine() 
    End Sub 
  End Module 
End Namespace

Die Objektbeziehung kann in der Ausgabe genutzt werden:

Turbine 3 in Flugzeug A380

Rheinwerk Computing - Zum Seitenanfang

3.8.2 Sichtbarkeit Zur nächsten ÜberschriftZur vorigen Überschrift

Eine innere Klasse ist bezüglich der Sichtbarkeit ein normales Klassenmitglied. Dies bedeutet, dass sie auch privat sein kann. In Zusammenhang mit dem Geheimnisprinzip bedeutet dies, dass auch kein Objekt vom Typ der inneren Klasse außerhalb der Klasse existieren kann. Daher wird das folgende Codefragment als ungültig zurückgewiesen:

  Class Firma 
    Function Interna() As Struktur 'verboten!! 
      Return New Struktur 
    End Function

    Private Class Struktur 
      Partial Private Sub Anlassen() 
      End Sub 
    End Class 
  End Class

Rheinwerk Computing - Zum Seitenanfang

3.8.3 Grafikbibliothek: Position des Rechtecks topZur vorigen Überschrift

In diesem Abschnitt erweitern wir die in Abschnitt 3.1.12, »Grafikbibliothek: Beispiel für Kapitel 3 und 4«, eingeführte und zuletzt in Abschnitt 3.7.9, »Grafikbibliothek: Eigenschaften des Rechtecks«, erweiterte Grafikanwendung. Dem Rechteck wird eine Position hinzugefügt. Sie repräsentiert die linke obere Ecke. Die Motivation, dies in einer inneren Klasse und nicht als Eigenschaft zu machen, sind die Methoden der inneren Klasse zum Bewegen des Rechtecks und zur Ausgabe der absoluten Abmessungen.


'...\Klassendesign\Graphik\InnereKlassen.vb

Option Explicit On 
Namespace Klassendesign 
  Partial Public Class Rechteck 
    Class Position 
      Dim rechteck As Rechteck 
      Dim x, y As Double

      Sub New(ByVal rechteck As Rechteck) 
        Me.rechteck = rechteck 
      End Sub

      Sub Bewegen(ByVal x As Double, ByVal y As Double) 
        Me.x = x : Me.y = y 
      End Sub

      Sub Abmessungen() 
        Console.WriteLine("Rechteck {0}x{1} – {2}x{3}", _ 
                          x, y, x + rechteck.a, y + rechteck.b) 
      End Sub 
    End Class 
  End Class 
End Namespace

Zuerst wird ein neues Rechteck erzeugt und dem Konstruktor der Position übergeben. Dann wird das Rechteck bewegt und die Abmessungen werden ausgegeben.


'...\Klassendesign\Zeichner\InnereKlassen.vb

Option Explicit On 
Namespace Klassendesign 
  Partial Class Zeichner 
    Sub InnereKlassen() 
      Dim rechteck As New Rechteck(7, 8)

      Dim position As New Rechteck.Position(rechteck) 
      position.Bewegen(100, 200) 
      position.Abmessungen()

    End Sub 
  End Class 
End Namespace

Zur Kontrolle sehen Sie hier die Ausgabe der Methode InnereKlassen():

Rechteck 100x200 – 107x208

Die nächste Erweiterung erfolgt in Abschnitt 3.9.7, »Grafikbibliothek: Vergleich von Rechtecken«.



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual Basic 2008
Visual Basic 2008
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Visual Basic 2012






 Visual Basic 2012


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern