Klasse in Klasse - Zugriff

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Klasse in Klasse - Zugriff

    Hallo,

    Ich habe eine Klasse mit dem namen JaB
    Innerhalb dieser Klasse befindet sich noch eine Klasse , mit dem Namen JFunctionz

    Jetzt möchte ich aus der Klasse JFunctionz auf Variablen und Subs/Funktionen der Klasse JaB zugreifen.

    Wenn ich jetzt also folgendes probiere:

    VB.NET-Quellcode

    1. Dim J As New JAB


    Um halt auf die Klasse JAB zugreifen zu können,
    bekomme ich folgende Meldung:

    Eine nicht behandelte Ausnahme des Typs "System.StackOverflowException" ist in T.exe aufgetreten.


    Jemand einen Tipp?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin Hombre“ ()

    Mein Verdacht ist, dass dein Code so aussieht:

    VB.NET-Quellcode

    1. Public Class JAB
    2. Dim Funcs As New JFunctionz
    3. Public Class JFunctionz
    4. Dim J As New JAB
    5. End Class
    6. End Class
    Das bewirkt Folgendes:
    Bei der Instanziierung von JAB wird eine neue Instanz von JFunctionz erstellt.
    Bei der Instanziierung von JFunctionz wird eine neue Instanz von JAB erstellt.
    Bei der Instanziierung von JAB wird eine neue Instanz von JFunctionz erstellt.
    usw.
    Das führt schlussendlich zu einer StackOverflowException.
    Zum Beispiel so:

    VB.NET-Quellcode

    1. Class JAB
    2. Dim Funcs As New FunctionZ(Me)
    3. Class FunctionZ
    4. Dim J As JAB
    5. Public Sub New(ByVal J_ As JAB)
    6. J = J_
    7. End Sub
    8. End Class
    9. End Class
    Du kannst aus einer fremden Klasse - auch wenn eine Klasse eine andere Klasse beinhält, ist sie für sie fremd - auf die Methoden einer anderen Klasse nur zugreifen, wenn sie Public sind.
    Ich kann mir gar nicht vorstellen, dass es bei dir früher funktioniert hat. Man könnte da zwar mit ein wenig Trickserei drumrum kommen, aber das ist alles andere als guter Programmierstil.
    Am besten sagst du uns, was genau du vor hast.

    Und zeig mal den kompletten Code, den du hattest, als noch die StackOverflowException auftrat. Mich würde interessieren, wie du das mit dem Zugriff genau gemacht hattest.
    Hm,

    also ich hatte den Code hier:

    VB.NET-Quellcode

    1. Module Haupt
    2. Class JAB
    3. .... hier subs und funktionen
    4. Class JFunctionz
    5. Dim J As New JAB
    6. End Class
    7. End Class
    8. End Module


    Konnte dann auch mit J.SubName z.B. auf Subs zugreifen , aber da kam wie gesagt der Fehler den ich oben beschrieben hatte.

    Ok . Break.


    Mein Ziel ist es später eine Library zu erstellen.

    Ich hatte mir das so vorgestellt:

    VB.NET-Quellcode

    1. Dim C As New JAB
    2. C.Test("blabla")


    C sollte dann halt die Klasse JFunctionZ enthalten(für spezifische Funktionen/Subs) z.B:

    VB.NET-Quellcode

    1. C.JFunctionz.WriteMessage("....")


    Das ist eigentlich mein Ziel.

    Und C enthält eben riesige Funktionen, die ich nicht nochmal in .JFunctionz reinhauen möchte.

    Verstehst Du?

    Vielleicht kennst Du oder auch andere, eine Methode, mit der ich das ähnlich realisieren kann!

    Wenn das wirklich nicht geht, pack ich es alles in eine Klasse - pech halt.

    haiyyu schrieb:

    Und warum möchtest du nicht die Methoden, auf die JFunctionz zugreifen können soll, Public machen?

    Wenn dann der Benutzer eine Instanz erstellt , bekommt er um die 100 Subs und 30 extra Funktionen , die er eigentlich gar nicht sehen soll/wederdennoch benötigt , angezeigt
    ,halt dadurch, dass sie public sind.

    Aber egal, wenns halt nicht geht - ist es halt so. Dann pack ich alles in eine Klasse.
    try this:

    VB.NET-Quellcode

    1. Public Class JAB
    2. Public Sub Test(ByVal s As String)
    3. '...
    4. End Sub
    5. Private Sub SomethingSpecial()
    6. End Sub
    7. Public ReadOnly JFunctions As New JFunctionz(Me)
    8. Public Class JFunctionz
    9. Private _Jab As JAB
    10. Public Sub New(ByVal Jab As JAB)
    11. _Jab = Jab
    12. End Sub
    13. Public Sub WriteMessage(ByVal s As String)
    14. _Jab.SomethingSpecial()
    15. End Sub
    16. End Class
    17. End Class

    Es ist möglich, innerhalb von jab eine Klasse zu halten, die wiederum ein Jab enthält. Nur darf sie das Jab nicht mit New erstellen, sonst hat man eine EndlosRekursion.
    Und interessant ist, dass JFunctionz Zugriff hat auf Private Methoden von Jab.
    So hatt ich's.
    Allerdings dachte ich nicht, dass das den Zugriff auf private Methoden ermöglicht.
    Also... Klasse in Klasse bedeutet, dass die innere Klasse auf die privaten Member der äußeren Klasse zugreifen kann?