vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Property gibt 2x hintereinander angewendet Unterschiedliches aus. 
Autor: Basti78
Datum: 09.08.15 12:56

Hallo Manfred,

Das mit der Initialisierung in New ist eine gute Idee. Ich hatte das verworfen,
weil ich zuvor versucht hatte, per "VObject = New T" im Konstruktor New() (ohne Variablen)
den Wert zu initialisieren, was so aber nicht funktioniert.

Ich hatte die Übergabe per ByRef bisher immer so verstanden, dass man schon auf das übergebene
Objekt zugreift, aber ohne dessen innere Variablen oder gar das Objekt selbst austauschen zu
können, so dass nur eine Kopie vom übergebenen Objekt auf INPUT übertragen wird (und damit auch
eine Kopie aller inneren Variablen und Objekte). Daher dachte ich, dass alle Methoden der über
ByRef übergebenen Variablen denselben Output haben (oder auch innerhalb von INPUT dasselbe mit den
inneren Variablen oder Objekte passiert wie im Originalobjekt, nur dass dies mit den kopierten Variablen/Objekten geschieht).
Eine Neudefinition etwa mittels INPUT = New Derived_1 hätte dann
keine Auswirkung auf das Originalobjekt, welches also dasselbe bleibt wie zuvor.

Die Übergabe ByVal war für mich immer eine Gleichsetzung von INPUT = übergebene Variable, so dass
also alles was mit INPUT geschieht, auch beim Originalobjekt geschieht, so dass ich also mit
INPUT = New Derived_1 auch das originalobjekt überschreiben würde.

Wenn mein bisheriges Verständnis aber falsch ist, dann frage ich mich, was mit ByRef überhaupt übergeben wird. Oder anders gefragt:
Was unterscheidet ein der Methode ByRef INPUT As T übergebenes Objekt von einem innerhalb der Methode mittels "Dim INPUT as New T"
neu definierten Objekts (davon mal abgesehen dass dies mit T nicht geht, aber mal angenommen wir hätten statt T dort eine bestimmte Klasse,
z.B. System.Windows.Forms.Button stehen und dann "Dim INPUT as New System.Windows.Forms.Button")? Macht es dann Sinn, ein Objekt ByRef zu übergeben?

Ich habe den Code angepasst und diesmal den Konstruktor genutzt, um die innere Objektvariable zu initialisieren (beim zweiten Beispiel)
und nun alle Objekte per ByVal übergeben. Es bleibt allerdings in beiden Beispielen beim gleichen Ergebnis, dass die aus der Property kommenden Werte nicht gleich sind:

Public Sub Main() 
  Dim o1 As New Derived_1 : o1.Initialize(New System.Windows.Forms.Button)
  '------------
  MsgBox("Beispiel 1 - mit separater Initialisierung")
  Dim o2 As New Derived_2 : o2.Initialize(New System.Windows.Forms.Form)
  MsgBox("Vor Objektübergabe: " & Convert.ToString(o1.GetType))
  If o1.Value Is Nothing Then MsgBox("Vor Objektübergabe: Nothing") Else MsgBox( _
    "Vor Objektübergabe: " & Convert.ToString(o1.Value.GetType))
  o2.ASub(o1)
  '------------
  MsgBox("Beispiel 2 - mit Initialisierung bei New()")
  Dim o3 As New Derived_1(New System.Windows.Forms.Button)
  Dim o4 As New Derived_2(New System.Windows.Forms.Form)
  MsgBox("Vor Objektübergabe: " & Convert.ToString(o3.GetType))
  If o3.Value Is Nothing Then MsgBox("Vor Objektübergabe: Nothing") Else MsgBox( _
    "Vor Objektübergabe: " & Convert.ToString(o3.Value.GetType))
  o4.ASub(o3)
  '------------
End Sub
Public MustInherit Class Base
  Public ReadOnly Property Value As System.Windows.Forms.Control
    Get
      Return Nothing
    End Get
  End Property
End Class
Public MustInherit Class Base(Of T As System.Windows.Forms.Control)
  Inherits Base
  Private VObject As T
  Public Sub New()
  End Sub
  Public Sub New(ByVal INPUT As T)
    VObject = INPUT
  End Sub
  Public Sub Initialize(ByVal INPUT As T)
    If VObject Is Nothing Then VObject = INPUT
  End Sub
  Public Overloads ReadOnly Property Value As T
    Get
      Return VObject
    End Get
  End Property
End Class
Public Class Derived_1
  Inherits Base(Of System.Windows.Forms.Button)
  Public Sub New()
  End Sub
  Public Sub New(ByVal INPUT As System.Windows.Forms.Button)
    MyBase.New(INPUT)
  End Sub
End Class
Public Class Derived_2
  Inherits Base(Of System.Windows.Forms.Form)
  Public Sub New()
  End Sub
  Public Sub New(ByVal INPUT As System.Windows.Forms.Form)
    MyBase.New(INPUT)
  End Sub
  Public Sub ASub(Of T As Base)(ByVal INPUT As T)
    MsgBox("Nach Objektübergabe: " & Convert.ToString(INPUT.GetType))
    If INPUT.Value Is Nothing Then MsgBox("Nach Objektübergabe: Nothing") Else _
      MsgBox("Nach Objektübergabe: " & Convert.ToString(INPUT.Value.GetType))
  End Sub
End Class
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Property gibt 2x hintereinander angewendet Unterschiedliches...1.412Basti7809.08.15 10:14
Re: Property gibt 2x hintereinander angewendet Unterschiedli...838Manfred X09.08.15 10:47
Re: Property gibt 2x hintereinander angewendet Unterschiedli...818Basti7809.08.15 12:56
Re: Property gibt 2x hintereinander angewendet Unterschiedli...762Manfred X09.08.15 13:24
Re: Property gibt 2x hintereinander angewendet Unterschiedli...779Basti7809.08.15 16:03
Re: Property gibt 2x hintereinander angewendet Unterschiedli...760sv0001009.08.15 17:09
Re: Property gibt 2x hintereinander angewendet Unterschiedli...775Manfred X09.08.15 17:38

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 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