none
Code ausführen beim Initialisieren einer Klasse RRS feed

  • Allgemeine Diskussion

  • Hallo Spezialisten und Profis,

    ich suche nach einer Methode, Funktion, oder sonsitegen Forgehensweise wie ich einen Code beim ersten Initialisieren einer Klasse ausführen kann nach dem der Konstruktor durchgelaufen ist. Ähnlich wie der Event Load bei einer WindowsForm.

    Ich möchte z.B. einen bestimmten Code ausführen der immer ausgeführt wirdl, egal welcher Konstruktor verwendet wird, das bedeutet das ich diesen auf keinen Falll in einem Konstruktor (New()) reinschreiben möchte da ich ja mehere Konstruktoren (ich hoffe das ist ein deutsches Wort :-) ) haben kann

    Natürlich kann ich ich eine Methode oder Sub am Schluss jedes Konstruktors ausführen lassen, doch ich habe etwas in Erinnerung das es den Weg wie ich ihn (hoffentlich versändlich) beschrieben habe auch gibt.

    Hier zwei Varianten, wobei die zweite die ist die ich vermeiden möchte.

    Variante1

    Public Class Class1
        ''' <summary>
        ''' Konstruktor 1
        ''' </summary>
        Public Sub New()
            'irgend ein Code ...
        End Sub
    
        ''' <summary>
        ''' Konstruktor 2
        ''' </summary>
        Public Sub New()
            'irgend ein anderer Code ...
        End Sub
    
        Public Sub Init()
            'dieser Code soll ausfeführt werden nachdem der gewünschte Konstruktor gestartet wurde
        End Sub
    
    End Class

    Variante2
    Public Class Class1
        ''' <summary>
        ''' Konstruktor 1
        ''' </summary>
        Public Sub New()
            'irgend ein Code ...
            Init()
        End Sub
    
        ''' <summary>
        ''' Konstruktor 2
        ''' </summary>
        Public Sub New()
            'irgend ein anderer Code ...
            Init()
        End Sub
    
        Public Sub Init()
            'dieser Code soll ausfeführt werden nachdem der gewünschte Konstruktor gestartet wurde
        End Sub
    
    End Class

    Vielen Dank im Voraus


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter

    • Typ geändert Ionut DumaModerator Dienstag, 29. Oktober 2013 16:42 Keine Rueckmeldung des Fragenstellender
    Mittwoch, 2. Oktober 2013 09:18

Alle Antworten

  • Hi Florian,

    was du Suchst gibt es meines Wissens nicht.

    Ich weiß jetzt nicht genau was du machen willst, aber wenn es darum geht "Komplexere" Objekte zu erzeugen kann man z.B. das Factory Pattern oder das Builder Pattern verwenden.

    MFG

    Björn

    Mittwoch, 2. Oktober 2013 10:26
  • Hallo Björn,

    was ich damit erreich will ich einen Bestimmten Code immer nach dem Ausführen eines Bliebigen Konstruktors ausführen kann, egal welcher Konstruktor ausgeführt wurde.


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter

    Mittwoch, 2. Oktober 2013 10:54
  • Hi Florian,

    was soll den der Code machen?

    Mittwoch, 2. Oktober 2013 11:00
  • Das ist nur ein Fiktives Beispiel.

    Danach soll eine Table mit Collums gefüllt werden und ein paar Sachen in Logfiles geschrieben werden, ich kann das zwar in eine Sub geben und diese bei jedem Konstruktor ausführen, ich bin aber eine Person die gerne alles wissen will.


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter


    Mittwoch, 2. Oktober 2013 13:05
  • Hi Florian,

    die Tabelle ist ja ein Controll, hier für solltest du ein UserControll (Basis Klasse) verwenden und dort hast du dann das Load/Loaded Event.

    MFG

    Björn

    Mittwoch, 2. Oktober 2013 13:46
  • Hallo Björn,

    ich weiß nicht von welcher Tabelle du redest (vielleicht ein Datagrid) aber ich meine die system.data.datatable (http://msdn.microsoft.com/de-de/library/system.data.datatable.aspx), ich habe die noch nie als UserControl verwendet und hätte auch keinen Plan wie ich das anstellen soll.

    Wie gesagt ich möchte einen Code nach einem Konstruktor ausführen der immer gleich ist und deswegen diesen nicht in eine Sub packen und die erstellte Sub bei jedem Konstruktor ausführen.


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter

    Mittwoch, 2. Oktober 2013 14:28
  • Hi Florian,

    ja ich hatte da wirklich an ein Datagrid gedacht.

    Wie gesagt was du möchtest geht so nicht direkt.

    Wenn du die Pattern nicht verwenden möchtest, würden mir noch 2 Möglichkeiten einfallen.

    Einmal die Trivial Lösung und Konstruktor Chaning verwenden. Hier mal der C# Ansatz und hier eine Möglichkeit es in VB umzusetzen.

    2. Eine Abstrakte Basis Klasse deren Konstruktor die Methode aufruft. Das könnte wie folgt aussehen.

    Public MustInherit Class SelfInitingKlasss
    
        Public Sub New()
            Init()
        End Sub
    
        Protected MustOverride Sub Init()
    
    End Class
    
    Public Class TestKlasse : Inherits SelfInitingKlasss
    
        Public _Name As String = GetName()
    
        Public Sub New()
            Dim test As String = "Name"
        End Sub
    
        Public Sub New(ByVal Name As String)
            _Name = Name
        End Sub
    
        Protected Overrides Sub Init()
            _Name = "Test"
        End Sub
    
        Private Function GetName() As String
            Return "GetName"
        End Function
    
    End Class

    Da bei ist aber genau zu beachten in welcher Reihenfolge die Klassen Initalisiert werden und welche Methoden wann aufgerufen werden.

    Da Init von der Basis Klasse aufgerufen wird wird es vor den Konstruktor der Abgleiteten Klasse aufgerufen.

    also also erst Init und an GetName und dann der Code der im Konstruktor steht. Am besten mal in Debugger anschauen.

    Meiner Meinung nach nicht wirklich eine gute Lösung.

    MFG

    Björn

    Mittwoch, 2. Oktober 2013 15:37
  • **************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    **************************************************************************************************

    Ionut Duma, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 21. Oktober 2013 15:25
    Moderator