vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Sch?tzen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Verschiedenes / Sonstiges   |   VB-Versionen: VB.NET16.05.06
Vererbung der Standard-Eigenschaft einer Klasse

Hinweise zum Verhalten der Standard-Eigenschaft einer Klasse beim Überschatten/Überladen

Autor:   Manfred BohnBewertung:     [ Jetzt bewerten ]Views:  10.415 
ohne HomepageSystem:  WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10kein Beispielprojekt 

VB.NET bietet zur Modifikation vererbter Eigenschaften einer Klasse verschiedene Techniken:

  • die Überschreibung (OVERRIDES)
  • die Überladung (OVERLOADS)
  • die Überschattung (SHADOWS)

In der deutschsprachigen VB-Dokumentation wid das Verfahren der Überschattung auch als Spiegelung bezeichnet.
Ich halte diesen Begriff für mißverständlich und bevorzuge deshalb den anschaulicheren Begriff 'Überschattung'.

Im Hinblick auf die Vererbung der Standardeigenschaft (DEFAULT PROPERTY) einer Klasse, gibt es ein problematisches Phänomen:
Wird eine Standardeigenschaft aus einer Basisklasse durch eine Nicht-Standardeigenschaft in einer abgeleiteten Klasse gespiegelt (=überschattet), kann dennoch mit Standardeigenschafts-Syntax auf die Standardeigenschaft der Basisklasse zugegriffen werden.
Dieser Effekt tritt nicht nur bei Anwendung der Technik der Überschattung, sondern auch bei der Überladung einer Standardeigenschaft auf.

Er vererbt sich zudem auf abgeleitete Klassen weiter.

Aus diesem Grund sollte bei der Überschattung bzw. Überladung der geerbten Standard-Eigenschaft immer das Schlüsselwort DEFAULT verwendet werden, damit der Zugriff auf die Standard-Eigenschaft der Basisklasse völlig blockiert wird und auch bei der Weitervererbung eindeutige Zugriffsverhältnisse vorliegen.

Die Effekte im einzelnen demonstriert der kommentierte DEMO-Code.
Er besteht aus einem Modul, in dem die abgeleiteten Klassen enthalten sind und einem Formular mit Testaufrufen.

' ==================================================================================
' Modul 'modDefaultProperty'
' ==================================================================================
 
' VB.NET 2005
 
Option Explicit On
Option Strict On
 
Module modDefaultProperty
 
  ' Das Modul enthält eine Ableitungskette von Klassen
  ' und dient der Demonstration der Vererbung der 
  ' STANDARD-EIGENSCHAFT einer Klasse bei den verschiedenen
  ' Techniken: ÜBERLADEN, ÜBERSCHATTEN, ÜBERSCHREIBEN
  ' unter Verwendung bzw. Weglassung de Schlüsselworts DEFAULT
 
  Public Class cA
 
    ' Die 'Basisklasse' mit der 
    ' Standardeigenschaft 'TestEigenschaft'
    Default ReadOnly Property TestEigenschaft(ByVal x As Integer) As String
      Get
        Dim str As String
        str = "Standard-Testeigenschaft der Klasse 'cA'" + vbCrLf + _
          "Default ReadOnly Property"
        MsgBox(str)
        Return str
      End Get
    End Property
 
  End Class
 
  Public Class cA1
 
    Inherits cA
 
    ' Die geerbte Standardeigenschaft aus der Klasse 'cA'
    ' wird durch eine 'einfache' Eigenschaft zwar überladen,
    ' bleibt als Standard-Eigenschaft von 'cA1' aber erhalten
    ' und wird als Standard-Eigenschaft auch weitervererbt
    Overloads ReadOnly Property TestEigenschaft(ByVal x As Integer) As String
      Get
        Dim str As String
        str = "TestEigenschaft der Klasse cA1" + vbCrLf + _
          "Overloads ReadOnly Property"
        MsgBox(str)
        Return str
      End Get
    End Property
  End Class
 
  Public Class cA2
 
    Inherits cA1
 
    ' Die Klasse 'cA2' erbt von 'cA1' deren Standardeigenschaft
    ' und vererbt sie weiter
    ' Auch die Überladung der Standard-Eigenschaft durch eine 
    ' 'einfache' Eigenschaft mit verkürzter Parameterliste 
    ' ändert daran nichts 
    Overloads ReadOnly Property TestEigenschaft() As String
      Get
        Dim str As String
        str = "TestEigenschaft der Klasse cA2" + vbCrLf + _
          "Overloads ReadOnly Property"
        MsgBox(str)
        Return str
      End Get
    End Property
 
  End Class
 
  Public Class cA3
 
    Inherits cA2
 
    ' Die Klasse 'cA2' vererbt die von 'cA1' geerbte
    ' Standardeigenschaft zwar an 'cA3' weiter, 
    ' aber deren Aufruf wird durch 
    ' die Überladung der Standardeigenschaft in 'cA3' blockiert 
    ' und sie wird deshalb auch nicht mehr weitervererbt
    Default Overloads ReadOnly Property TestEigenschaft(ByVal x As Integer) As String
      Get
        Dim str As String
        str = "Standard-Testeigenschaft der Klasse cA3" + vbCrLf + _
          "Default Overloads ReadOnly Property"
        MsgBox(str)
        Return str
      End Get
    End Property
 
  End Class
 
  Public Class cA4
 
    Inherits cA3
 
    ' Die Klasse 'cA4' erbt die Standardeigenschaft von 'cA3',
    ' und vererbt sie weiter
    ' Die 'Beschattung' des Namens der geerbten Standard-Eigenschaft 
    ' durch eine gleichnamige Methode ändert daran nichts
    Shadows Function Testeigenschaft() As String
 
      Dim str As String
      str = "Testmethode der Klasse cA4" + vbCrLf + _
        "Shadows Function"
      MsgBox(str)
      Return str
    End Function
 
  End Class
 
  Public Class cA5
 
    Inherits cA4
 
    ' Die Klasse 'cA5' erbt die Standardeigenschaft von 'cA4',
    ' Die 'Beschattung' der geerbten Standard-Eigenschaft durch 
    ' eine DEFAULT Property verhindert aber deren Aufruf und auch
    ' deren Weitervererbung  
 
    ' Das Weglassen des Schlüsselworts 'Shadows' würde zu einer 
    ' Warnung führen, wegen des Konflikts mit der aus 'cA4' 
    ' geerbten Eigenschaft
 
    Default Overridable Shadows ReadOnly Property Testeigenschaft(ByVal x As Integer) As String
      Get
        Dim str As String
        str = "Standard-Eigenschaft der Klasse 'cA5'" + vbCrLf + _
          "Default Overridable Shadows ReadOnly Property"
        MsgBox(str)
        Return str
      End Get
    End Property
 
  End Class
 
  Public Class cA6
 
    ' Die Klasse 'cA6' erbt die Standard-Eigenschaft 
    ' der Klasse 'cA5' und vererbt sie weiter 
 
    ' Die 'private' Testeigenschaft erzeugt eine Warnung, weil
    ' sie die geerbte Standard-Eigenschaft implizit 'beschattet',
    ' trotzdem bleibt die Standard-Eigenschaft erhalten, weil
    ' das Schlüsselwort 'Private' eine Auflösung erlaubt,
    ' trotz gleicher Parameterliste
    Inherits cA5
 
    Private ReadOnly Property Testeigenschaft(ByVal x As Integer) As String
      Get
        Dim str As String
        str = "Private Testeigenschaft in 'cA6'" + vbCrLf + _
          "Private ReadOnly Property"
        MsgBox(str)
        Return str
      End Get
    End Property
 
    Public Function Demo1() As String
      ' Aufruf der privaten Eigenschaft
      Demo1 = Testeigenschaft(0)
    End Function
 
    Public Function Demo2() As String
      ' Auf die geerbte Eigenschaft kann auch durch 
      ' Verwendung des Schlüsselworts 'MyBase' zugegriffen werden
      Demo2 = MyBase.Testeigenschaft(0)
    End Function
 
  End Class
 
  Public Class cA7
 
    Inherits cA6
 
    ' Die Klasse 'cA7' erbt die Standardeigenschaft der Klasse 'cA6'
    ' Da diese Standardeigenschaft in 'cA5' als 'Overridable'
    ' deklariert ist, kann sie hier überschrieben werden.
 
    ' Durch diese Überschreibung wird die Testeigenschaft 
    ' der Klasse 'cA7' zur vererbbaren Default-Eigenschaft, 
    ' obwohl sie nicht durch das Schlüsselwort DEFAULT 
    ' deklariert worden ist
 
    Overrides ReadOnly Property Testeigenschaft(ByVal x As Integer) As String
 
      Get
        Dim str As String
        str = "überschriebene Eigenschaft der Klasse 'cA7' " + vbCrLf + _
          "Overrides ReadOnly Property"
        MsgBox(str)
        Return str
      End Get
 
    End Property
  End Class
 
  Public Class cA8
 
    ' Die Klasse 'cA8' erbt als Standard-Eigenschaft die 
    ' in der Klasse 'cA7' überschriebene Eigenschaft
    Inherits cA7
 
  End Class
 
End Module
 
' ==================================================================================
' Ende Modul 'modDefaultProperty'
' ==================================================================================
' ============================================================================
' Formular 'frmDemo'
' ============================================================================
Option Explicit On
Option Strict On
 
Public Class frmDemo
 
  ' Das Formular demonstriert die Auswirkungen des Weglassens des
  ' Schlüsselworts DEFAULT beim Überladen bzw. Überschatten der
  ' Standard-Eigenschaft einer Klasse
 
  ' VB.Net 2005
 
  ' benötigt wird das Modul 'modDefaultProperty'
 
 
  Private Sub frmDemo_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
 
    Me.Show()
 
    ' Diese Klassen-Instanzen bilden eine Vererbungskette
    Dim a1 As New cA1
    Dim a2 As New cA2
    Dim a3 As New cA3
    Dim a4 As New cA4
    Dim a5 As New cA5
    Dim a6 As New cA6
    Dim a7 As New cA7
    Dim a8 As New cA8
 
    Dim str As String
 
    ' ===========================================================
 
    ' Aufruf der Testeigenschaft von a1
    str = a1.TestEigenschaft(0)
 
    ' Die Standardeigenschaft der Instanz 'a1' 
    ' ist geerbt von der Klasse 'cA' 
    str = a1(0)
 
    ' ===========================================================
 
    ' Aufruf der parameterfreien Testeigenschaft von 'a2'
    str = a2.TestEigenschaft
 
    ' Die Standardeigenschaft der Instanz 'a2' 
    ' ist weitervererbt von der Klasse 'cA1'
    str = a2(0)
 
    ' Bei namentlichem Aufruf wird nicht die geerbte Standard-
    ' eigenschaft, sondern die in der Klasse 'cA1'
    ' überladene Eigenschaft aufgerufen!!
    str = a2.TestEigenschaft(0)
 
    ' ===========================================================
 
    ' In der Klasse 'cA3' ist die geerbte Standardeigenschaft 
    ' durch eine eigene Standardeigenschaft überladen
    str = a3(0)
 
    ' Namentlicher Aufruf der Default Property von 'a3'
    str = a3.TestEigenschaft(0)
 
    ' Aufruf der von 'a2' geerbten Eigenschaft 
    ' mit abweichender Parameterliste
    str = a3.TestEigenschaft
 
    ' ===========================================================
 
    ' Die Instanz 'a4' erbt die in der Klasse 'cA3' überladene 
    ' Standard-Eigenschaft
    str = a4(0)
 
    ' Der namentliche Aufruf der überschattenden Test-Eigenschaft 
    ' der Klasse 'cA4'</font_
    str = a4.Testeigenschaft(0)
 
    ' ===========================================================
 
    ' Die Instanz der Klasse 'cA5' besitzt eine eigene Standard-
    ' eigenschaft, die als 'Beschattung' der Methode aus 'cA4' 
    ' deklariert worden ist</font
    str = a5(0)
 
    str = a5.Testeigenschaft(0)
 
    ' ===========================================================
 
    ' Die Instanz von 'cA6' erbt die Standard-Eigenschaft von 'cA5'
    ' und vererbt sie weiter
    str = a6(0)
 
    ' Zugriff auf die private 'Testeigenschaft' von 'a6' 
    str = a6.Demo1()
 
    ' Zugriff auf die geerbte Standard-Eigenschaft von 'a6'
    str = a6.Demo2()
    ' ============================================================
 
    ' Zugriff auf die in 'cA7' überschriebene 
    ' Eigenschaft 
    str = a7.Testeigenschaft(0)
 
    ' das Überschreiben einer Standard-Eigenschaft erzeugt eine
    ' neue Standard-Eigenschaft auch ohne das Schlüsselwort DEFAULT 
    str = a7(0)
 
    ' ============================================================
 
    ' die in 'cA7' überschriebene Eigenschaft wird als
    ' Standard-Eigenschaft weitervererbt
    str = a8(0)
 
    ' direkter Aufruf der von 'cA7' geerbten Standard-Eigenschaft
    str = a8.Testeigenschaft(0)
 
    ' indirekter Zugriff auf die vererbte private TestEigenschaft,
    ' deklariert in der Klasse 'cA6'
    str = a8.Demo1
 
  End Sub
 
End Class
 
' ============================================================================
' Ende Formular 'frmDemo'
' ============================================================================

Dieser Tipp wurde bereits 10.415 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel