| |

VB.NET - Ein- und UmsteigerRe: 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 |  |
 | 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 |
  |
|
Neu! sevEingabe 3.0 
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket 
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1866.50 EUR...
Jetzt nur 979,00 EURWeitere Infos
|
|
|
Copyright ©2000-2025 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
|
|