Kommunikation von Objekten

  • Allgemein

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Kommunikation von Objekten

    wie ist es denn möglich, von einer "Sub"-Klasse auf eine andere zuzugreifen, wenn für beide in der MainForm eine Instanz erstellt wurde?

    Mainform:

    VB.NET-Quellcode

    1. Private ClassTest As New clTest()
    2. Private ClassAllgemeineFunktionen As New clAllgemeineFunktionen()
    3. Private ClassTestumgebung As New clTestumgebung()


    Frage: Zugriff von clTest auf Funktionen in clAllgemeineFunktionen und clTestumgebung usw.

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

    VeryBasics

    Aber es kann auch ein ungünstiges Design vorliegen, wenn so um die Ecke gegrabscht werden muß.
    zB dein clAllgemeineFunktion - was ist da drin?

    Bei mir sind allgemeine Funktionen entweder Public Shared oder es sind gar Extension-Methods in einem Modul. Beides braucht nicht instanziert zu werden, und ist allgemein verfügbar.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Die "VeryBasics" lese ich mir gerade durch.

    @Rod: Mit "Subklasse" meine ich einfach andere .vb-Dateien mit einer entsprechenden Klasse, in welcher Funktionen stehen, die ich in der "Hauptklasse" (MainForm.vb) sowie in anderen "Subklassen" benötige. Das Problem hierbei: Wie kann ich von einer Subklasse auf eine andere zugreifen und vice-versa, ohne, dass eine Endlosschleife entsteht?

    Die vier vb-Dateien mit den vier Klassen habe ich einmal gepackt angehängt.

    Edit:

    "VeryBasics" schrieb:

    Hält man sich an die Baum-Struktur, so gibt es nur Kommunikation zwischen Owner und Sub-Objekt, keine Kommunikation zw. "benachbarten" Sub-Objekten.


    d.h. die Submethoden, die auf andere Methoden anderer Subklassen zugreifen möchten, muss ich alle in eine gemeinsame Klasse packen, um der Baum-Struktur gerecht zu werden?
    Dateien
    • vb-Dateien.rar

      (14,65 kB, 110 mal heruntergeladen, zuletzt: )

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

    Also als Hauptklasse kann man eine Klasse bezeichnen, in der Objekte der SubKlasse instanziert werden, damit die Hauptklasse sich der Funktionalität der SubKlasse bedienen kann.

    Bei einem Form1 mit einem Button drauf wäre Form1 also die Hauptklasse, und der Button die SubKlasse.
    In VeryBasics ist ausgeführt, dass nun Form1 an die Button-Klasse gekoppelt ist, es "kennt" seinen Button.
    Der Button hingegen kennt die Form1-Klasse nicht, und dassis gut so, dadurch ist er flexibel einsetzbar auch auf anneren Form-Klassen, etwa auf einem Form2.

    Was daraus folgt für die Kommunikation zw. Form1 und seim Button ist ja in VeryBasics ausgeführt, mussichdas jetzt hier wiederholen?
    genau. Aber ein Objekt von a erzeuge ich doch durch:

    VB.NET-Quellcode

    1. dim Obja as new a()


    Problem: Wenn ich jetzt ZUSÄTZLICH von BlubbA auf BlubbB zugreifen möchte, benötige ich ja auch ein Objekt von b. Wenn ich dieses in a erstelle, dann habe ich eine Endlosschleife. Und genau das ist die Problematik ;)

    stevez schrieb:

    benötige ich ja auch ein Objekt von b. Wenn ich dieses in a erstelle
    Ist a oder b die Hauptklasse?
    Die Hauptklasse bedient sich der Methode der Nebenklasse, indem sie sie aufruft. Falls die Nebenklasse etwas "zu melden" hat, wirft sie an diese einfach ein Event. Dazu muss die Instanz der Nebenklasse mit WithEvents deklariert werden und in der Hauptklasse muss ein entsprechender Eventhandler vorhanden sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Ist a oder b die Hauptklasse?
    Keine von beiden. Es geht um die Kommunikation zwischen "nicht-haupt-"Klassen.

    @Erfinder ich les es mir gerade noch einmal durch

    ____________


    Also kurz: Wenn ich von einer "Sub-"Klasse eine Funktion einer anderen "Sub-"Klasse aufrufen möchte, muss ich ein Event senden, welches von der Hauptklasse interpretiert wird. Von dieser wird dann die entsprechende Funktion in der anderen "Sub-"Klasse ausgeführt, bin ich da korrekt? Gibt es dabei Möglichkeiten der Variablenübergebung oder lieber die einzelnen Funktionen in die selbe Klasse schreiben?

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

    stevez schrieb:

    bin ich da korrekt?
    Ja

    stevez schrieb:

    Gibt es dabei Möglichkeiten der Variablenübergebung oder lieber die einzelnen Funktionen in die selbe Klasse schreiben?
    was meinst du mit Variablenübergebung, und inwieweit ist "einzelnen Funktionen in die selbe Klasse schreiben" eine Alternative zu "Variablenübergebung"?
    was meinst du mit Variablenübergebung, und inwieweit ist "einzelnen Funktionen in die selbe Klasse schreiben" eine Alternative zu "Variablenübergebung"?
    Parameterübergabe "funktionABC(variable1, variable2)" -> bei Eventauslösungen von der Subklasse logischerweise nicht möglich. Oder einfach in der Subklasse die entsprechenden Variablen als public deklarieren und von der Mainclass nutzen, um die Funktion aufzurufen?

    inwieweit ist "einzelnen Funktionen in die selbe Klasse schreiben" eine Alternative zu "Variablenübergebung"?
    Sollte eine Frage sein, ob dies eventuell sinnvoller ist, wegen mehr Codeaufwand.

    stevez schrieb:

    Es geht um die Kommunikation zwischen "nicht-haupt-"Klassen.
    Da muss ich Dir ganz klar sagen, dass da Dein Design etwas liederlich ist. Solch sollte nicht vorkommen.
    Mit Gewalt würde ich die Hauptklasse als "Relaisstation" verwenden, also ein Event von a nach Hauptklasse und von dort per Property oder wo nach b reichen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    stevez schrieb:

    Parameterübergabe "funktionABC(variable1, variable2)" -> bei Eventauslösungen von der Subklasse logischerweise nicht möglich. Oder einfach in der Subklasse die entsprechenden Variablen als public deklarieren und von der Mainclass nutzen, um die Funktion aufzurufen?
    Bei Events ist beides möglich. Man kann sich Eventargs schreiben, die Daten transportieren, man kann auch leere Eventargs verschicken, und die Daten als public Property bereitstellen, die dann extra nochmal abzurufen sind.
    Kommt auf den Einzelfall an.
    gugge auch Alles über Events

    stevez schrieb:

    Sollte eine Frage sein, ob dies eventuell sinnvoller ist, wegen mehr Codeaufwand.
    also die Frage habichnich verstanden - egal.

    @Rod: kannste pauschal nicht sagen, dass das ein Design-Fehler sei. Sieht danach aus, weil wenn was umständlich wird, ists meist ein Design-Fehler. Aber manchmal ist son Design auch einfach das geringere Übel.

    @TE: vlt. erzählste auch einfach mal konkret, was du vorhast.
    Ich hatte halt vor, alle Funktionen/Subs für "Testdurchläufe", sowie "Allgemeines" wie DatenbankSpeichern in eine eigene Klasse zu schreiben. Nur benötigen die Subs der Testklasse immer wieder einmal bestimmte Daten, welche in Subs in der AllgemeinenKlasse bereitgestellt werden, oder die Testklasse muss auf das Dataset, welches in der MainForm geladen ist, zugreifen. Daher: Ansatzproblem ;) Ich programmiere jetzt erst einmal in einer Klasse weiter, das "Aufräumen" stelle ich dann einmal hinten an

    ErfinderDesRades schrieb:

    kannste pauschal nicht sagen, dass das ein Design-Fehler sei.
    Ich geh da ran und sage Der eine ist Master, der andere Slave. Und wenn ich 17 Slaves habe (hätte ich gern :D ), so haben die nix miteinander zu bequasseln, die haben zu arbeiten. Und die haben den Dienstweg einzuhalten. Das "Tunneln" von Information ist da einfach verboten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!