Prozedur mit variabler Anzahl von Parametern

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von cl10k.

    Prozedur mit variabler Anzahl von Parametern

    Hallo,

    gibt es eine elegante Möglichkeit an eine Prozedur eine variable Anzahl (1...n) von Parametern zu übergeben?

    Optional byval ... ist leider keine Möglichkeit, da ich nicht auf Verdacht eine Prozedur mit 100 optionalen Parametern erstelle und dann ggf 101 Parameter brauche ;)

    Die Parameter sind leider auch noch von verschiedenen eigenen Datentypen.

    lg
    Hallo ihr Beiden,

    mittlerweile habe ich das Problem komplett anders gelöst und gar keinen Gebrauch von meiner ursprünglichen Idee gemacht!


    @Artentus

    Guter Tipp, danke!


    @~blaze~

    Die Problemstellung ist ein wenig speziell :)
    Ich habe ein komplexes technisches System (z.B. Auto) als Klassenhierarchie modelliert. Subsysteme (des Autos) kann man deaktivieren - die Properties der zugehörigen Klasse werden dann auf nothing gesetzt damit bestimmte Rechnungen korrekt ablaufen.

    Alle Teilklassen erben von einer gemeinsamen Basisklasse. Dort hätte ich gern eine Prozedur erstellt, welche eine beliebige Anzahl von Properties entgegennimmt, deren Wert zwischenspeichert und die Properties anschließend auf nothing setzt. Da alle Teilklassen aber unterschiedlich viele Properties haben, wäre die Anzahl der Parameter die ich an meine Deaktivierungroutine übergeben hätte immer unterschiedlich gewesen.


    Wie gesagt, mittlerweile hat sich die Idee aber erledigt. :whistling:

    cl10k schrieb:

    eine elegante Möglichkeit
    besteht in der Verwendung von Properties, da braucht die Prozedur gar keine Parameter.
    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!

    cl10k schrieb:

    Was meinst du genau?
    Statt 17 Parameter zu übergeben setzt Du diese Parameter über Properties:

    VB.NET-Quellcode

    1. Class Xyz
    2. Public Property MyValue1 As Integer
    3. Public Property MyValue2 As Integer
    4. Public Property MyValue3 As Integer
    5. Public Sub MyProcedureCall()
    6. '...
    7. End Sub
    8. End Class

    VB.NET-Quellcode

    1. ' ...
    2. Dim xxx As New Xyz
    3. xxx.MyValue1 = 17
    4. xxx.MyValue2 = 32
    5. xxx.MyValue3 = -123
    6. xxx.MyProcedureCall()
    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!
    Ich verstehe nach wie vor nicht, was dass mit der Fragestellung zu tun hat.

    Was ich bisher machte war folgendes

    VB.NET-Quellcode

    1. Class XYZ
    2. inherits BaseClass
    3. Public Property Test1 As Integer?
    4. Private Property Test1Save As Integer?
    5. Public Property Test2 As Integer?
    6. Private Property Test2Save As Integer?
    7. Public Sub Deactivate(byval tmp as boolean)
    8. If tmp=true
    9. Test1Save =Test1
    10. Test1=nothing
    11. Test2Save =Test2
    12. Test2=nothing
    13. else
    14. Test1=Test1Save
    15. Test2=Test1Save
    16. End If
    17. End
    18. End Class


    und das halt für verschiedene Klasse mit jeweils unterschiedlichen Anzahl an Properties. Da aber alle Klassen von einer Basisklasse erben wollte ich dort die Deactivate Prozedur zentral hinterlegen und die zu deaktivierenden Properties als Parameter übergeben...

    cl10k schrieb:

    was dass mit der Fragestellung zu tun hat.
    Vielleicht habe ich die Fragestellung in Frage gestellt oder Ad Absurdum geführt.
    Probier mal, Dein Problem aus einem anderen Blickwinkel zu betrachten.
    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:


    Probier mal, Dein Problem aus einem anderen Blickwinkel zu betrachten.


    Das habe ich mittlerweile getan und eine Lösung gefunden mit der ich sehr zufrieden bin.

    In Kurzfassung:

    Ich habe mir einen eigenen Datentyp erstellt der von Double? abgeleitet ist (es gibt auch einen für Integer?) und eine zusätzliche Property Deactivated besitzt:

    VB.NET-Quellcode

    1. Public Class cls_DataClassRangedDoubleProperty
    2. Inherits cls_DataBaseClass 'übernimmt u.a. Inotify für DataBinding
    3. Private _DataValue As Double?
    4. Private _tmpDataValue As Double?
    5. Private _Deactivated As Boolean
    6. Public Property DataValue() As Double?
    7. Get
    8. Return _DataValue
    9. End Get
    10. Set(ByVal value As Double?)
    11. If _DataValue = value Then Return 'Don't raise PropertyChanged if DataValue hasn't changed
    12. _DataValue = value
    13. NotifyPropertyChanged("DataValue")
    14. End Set
    15. End Property
    16. Public Property Deactivated() As Boolean
    17. Get
    18. Return _Deactivated
    19. End Get
    20. Set(ByVal value As Boolean)
    21. If _Deactivated = value Then Return 'Don't raise PropertyChanged if Deactivated status hasn't changed
    22. _Deactivated = value
    23. If value = True Then
    24. _tmpDataValue = DataValue
    25. DataValue = Nothing
    26. Else
    27. DataValue = _tmpDataValue
    28. End If
    29. NotifyPropertyChanged("Deactivated")
    30. End Set
    31. End Property
    32. End Class


    (Tatsächlich ist das nur ein Ausschnitt aus der gesamten Klasse. Vorhanden sind auch noch Properties für Grenzen des Gültigkeitsbereiches von DataValue und eine kleine Routine zur Validierung ob DataValue innerhalb dieser Grenzen liegt)

    Per DataBinding hängt dann sowohl DataValue an einer geeigneten Control-Property als auch Deactivated an der Enable-Property des gleichen Controls. Wird also das Control deaktiviert, speichert meine Klasse das DataValue in tmpDataValue und setzt es dann auf nothing.

    (Richtig rund wird das Konzept erst dadurch, dass ich nicht an StandardControls binde, sondern an UserControls die dementsprechend eine passende Funktionalität besitzen)

    Ich hoffe das Konzept ist in der Kürze nachvollziehbar...

    lg

    PS: Trotzden scheinst du heute in Rätsellaune zu sein, oder?

    cl10k schrieb:

    Ich habe mir einen eigenen Datentyp erstellt der von Double? abgeleitet ist
    Das ist eine Property vom Typ Nullable(Of Double).
    Also im Prinzip genau das, was ich Dir die ganze Zeit gesagt habe. :D
    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!