| |
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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere Infos
|
|
|
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
|
|