wann wird eigenlich ein Konstruktor aufgerufen?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    wann wird eigenlich ein Konstruktor aufgerufen?

    Hallo leute. Hab problem wie folgt:

    habe klasse a, klasse b und klasse c.

    klasse a erstellt klasse b und c als friend. jetzt will ich das klasse b auf klasse c zugreift. bekanntlicherweise geht das so:

    in der klasse b steht dann irgend wo in einer funktion drinn: a.c.funktion()

    bis jetzt kein problem. aber irgend wie wird jedes mal wenn ich versuche auf die funkton von klasse c zuzugreifen, wird die klasse a neu erstellt. der konstruktor wird aufgerufen usw... weis nicht was ich falsch mache... meiner meinung nach muss der konstruktor nur einmal aufgerufen werden, wenn es erstellt wird. oder denke ich irgend wie falsch?

    danke im vorraus
    Public Class a
    Friend b As New b
    Friend c As New c
    .......

    _____________________________________________________________________________

    public Class b
    ......

    public sub greifeAufCZu()
    a.c.funktion()
    end sub


    ______________________________________________________________________________

    public Class c
    .....

    public sub funktion()
    ......
    end funktion

    ______________________________________________________________________________

    reicht das? kann ja schlecht alle drei klassen hier auflisten...
    Irgendwie nicht eindeutig.
    Du verwendest "a" sowohl um die Klasse zu bezeichnen, als auch um die INSTANZ der Klasse A in B zu kennzeichnen. Wenn das im Code auch so wäre, hättest du ja schon ein Problem, denn den Klassennamen verwendet man iA nur wenn man auf shared Methoden/Eigenschaften zugreift.
    Ich vermute mal, dass du in der Sub in B eine Instanz von A erstellst. Die wird verworfen, sobald du die Sub verläßt und beim nächsten verwenden der Sub wieder wieder eine NEUE Instanz von A erstellt.
    natürlich kannst du von a auf b zugreifen genau so wie von b auf a. wenn du das richtig machst kannst du das. wenn du das nicht kennst, warum versuchts du mit zu reden? sag doch einfach mal ok. kenn ihc nicht, lass ich die quatschen. oder willst du einfach mal überall mit reden?

    so und nun zu antwort davor:

    ja es sind instanzen. könnte jetzt dir die ganze klasse reinkopieren: wenn du das ansehen willst:
    'erste klasse:

    Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Friend sys As New sys
    4. Friend dauer As New dauerlauf
    5. Friend sw As New sweep
    6. Friend log As New LogarithmischerMesslauf
    7. Friend d As New Diagramm
    8. Friend ext As New Extern
    9. Private temp_Sender As Integer
    10. Private pid_Gestartet As Boolean = False
    11. Public Sub New()
    12. InitializeComponent()
    13. End Sub
    14. Public Function pid() As Boolean
    15. Return pid_Gestartet
    16. End Function
    17. Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick
    18. sys.systemStatus()
    19. If pid_Gestartet Then
    20. sys.status()
    21. End If
    22. End Sub
    23. ........


    zweite klasse:

    Quellcode

    1. Public Class sys
    2. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    3. Dim adwin As New adwin
    4. Dim inout As New InOutData
    5. Private arrayAdwin(80) As Integer
    6. Private arrayAdwinf(80) As Single
    7. Private digin(5) As Boolean
    8. Private zustand As Integer
    9. Private istZustand As Double
    10. Private offsetZustand As Double
    11. Private PIDGeladen As Boolean = False
    12. Public Function getIst() As Double
    13. Return istZustand
    14. End Function
    15. ......


    dritte klasse:

    Brainfuck-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.IO
    3. Public Class Extern
    4. Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    5. Dim WithEvents worker As New BackgroundWorker
    6. Dim werte(100000000) As String
    7. Dim gesamtAnzahlDerWerte As Integer
    8. Dim j, x, i As Integer
    9. Public Sub New()
    10. worker.WorkerReportsProgress = True
    11. worker.WorkerSupportsCancellation = True
    12. End Sub
    13. Private Function werteAuslesen() As Integer
    14. Dim x() As String
    15. Dim i = 0
    16. Dim zeile As String
    17. Dim fs As FileStream
    18. Dim sw As StreamReader
    19. Dim ofd As New OpenFileDialog
    20. ofd.Filter = "Hydro (*.ASC)|*.ASC| " & "Alle Dateien (*.*)|*.*"
    21. ofd.Title = "Wählen Sie eine Datei zum Öffnen aus"
    22. If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
    23. If Not File.Exists(ofd.FileName) Then
    24. MsgBox("Die Datei " & ofd.FileName & " existiert nicht!")
    25. Return 0
    26. End If
    27. fs = New FileStream(ofd.FileName, FileMode.Open)
    28. sw = New StreamReader(fs)
    29. Do Until sw.Peek() = -1
    30. zeile = sw.ReadLine()
    31. If zeile = "Messzeit[hh:mm:ss];Schreiben 0 [V];" Then
    32. Do Until sw.Peek() = -1
    33. zeile = sw.ReadLine()
    34. If zeile = "" Then
    35. ......
    36. Private Sub Worker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork
    37. Dim fifo(9999) As Single
    38. For Me.x = 0 To 10
    39. fifo(j) = werte(i)
    40. i += 1
    41. j += 1
    42. worker.ReportProgress(j)
    43. If worker.CancellationPending = True Then
    44. Exit Sub
    45. End If
    46. If (j > 9999) Then
    47. j = 0
    48. While Form1.sys.fifoFree = False ' <--------------------------------------Hier ist mein Problem!!!!!!
    49. Sleep(100)
    50. End While
    51. Form1.sys.fifoFullen(fifo)
    52. End If
    53. If (i >= gesamtAnzahlDerWerte) Then
    54. i = 0
    55. End If
    56. x = 1
    57. Next x
    58. End Sub
    59. ......


    Und? in der dritten klasse hab ich ein problem. die funktion ist gegeben. tut auch. Form1.sys.fifoFree aber er erstellt die klasse neu...
    Kann es sein, dass du nicht Form1.Show machst, sondern irgendwo:
    dim f as new form1
    f.show
    ?

    EIGENTLICH (!) sollte man wenn möglich nicht mit den Standardinstanzen arbeiten.

    Bei dir müsste das besser so aussehen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public c1 As Class1
    3. Public c2 As Class2
    4. Public Sub New()
    5. ' This call is required by the designer.
    6. InitializeComponent()
    7. ' Add any initialization after the InitializeComponent() call.
    8. c1 = New Class1(Me)
    9. c2 = New Class2(Me)
    10. End Sub
    11. End Class
    12. Public Class Class1
    13. Public Property Parent As Form1
    14. Public Sub New(ByVal f As Form1)
    15. Me.Parent = f
    16. End Sub
    17. Public Sub dummy()
    18. End Sub
    19. End Class
    20. Public Class Class2
    21. Public Property Parent As Form1
    22. Public Sub New(ByVal f As Form1)
    23. Me.Parent = f
    24. End Sub
    25. Public Sub CallIntoOtherClass()
    26. ' Es wird die Parentform abgerufen!!
    27. Me.Parent.c1.dummy()
    28. End Sub
    29. End Class
    weil ich nunmal zu schlecht bin und das Programmieren gerade mal erst angefangen habe...
    Grundsätzlich ist das nicht möglich, ganz besonders nicht mit den Beispielklassen, da war überhaupt nichts als Shared deklariert und wäre somit auch nicht Zugreifbar gewesen, hättest du uns gesagt, dass Klasse1 eine Form ist, dann wäre das schonmal gleich etwas ganz anderes gewesen, da VB aus dieser automatisch eine Instanz generiert und diese somit für dich Zugreifbar ist...aber einen solchen Zugriff würde ich allgemein versuchen zu vermeiden und lieber die Form beim generieren der Klasse an den Konstruktor übergeben, dann kannst du sicher gehen, dass die Form nicht geschlossen und wieder geöffnet worden ist...

    Edit: zu spät, aber meine Worte :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---