none
Klasse mit generischen New, mit zwei Parametern RRS feed

  • Frage

  • Hallo,

    kann mir jemand sagen wie die Syntax aussieht, wenn ich einen Konstuktor habe, dem ich zwei Parameter übergeben muss. 

    Public Class wsInstAndConfig(Of t As New)  ' !! New sollte zwei Parameter haben.   Wie geht das?

        Dim _Service As t

      Public ReadOnly Property Service As t
        Get
          Return _Service
        End Get
      End Property

      Public Sub New(ByVal strHost As String, Optional ByVal strPort As String = Nothing)
          Dim s As String
        Try

    ...

          _Service = New t(xxx, yyy)   ' ????    wie bekomme ich das hin ??

    Gruss an Alle

    Mittwoch, 4. Mai 2016 09:44

Antworten

  • Hi,
    die Lösung könnte so ausgesehen haben werden:

    Module Module1
    
      Sub Main()
        Dim email As String = String.Empty
        Dim password As String = String.Empty
        Dim IdentificationID As Integer = 0
        Dim Text As String = String.Empty
        Dim wsX1 As New wsConfig(Of wsopfXXX.opfXXXSoapClient)("localhost", 5689)
        wsX1.Service.Login(email, password, IdentificationID)
        Dim wsZ1 As New wsConfig(Of wsopfZZZ.opfZZZSoapClient)("wsopf.ServerDev02", Nothing)
        wsZ1.Service.Melden(email, Text)
        Console.ReadKey() ' Stopper
      End Sub
    
    End Module
    
    Friend Class wsConfig(Of T As New)
    
      Public Sub New(ByVal strHost As String, Optional ByVal strPort As Integer? = Nothing)
        _Service = New T
      End Sub
    
      Private _Service As T
    
      Public ReadOnly Property Service As T
        Get
          Return _Service
        End Get
      End Property
    End Class
    
    Friend MustInherit Class opfXXXSoapBasis
      Friend Overridable Sub Login(par1 As String, par2 As String, par3 As Integer)
      End Sub
      Friend Overridable Sub Melden(par1 As String, par2 As String)
      End Sub
    End Class
    
    Namespace wsopfXXX
    
      Friend Class opfXXXSoapClient
        Inherits opfXXXSoapBasis
        Public Sub New()
        End Sub
        Friend Overrides Sub Login(par1 As String, par2 As String, par3 As Integer)
          MyBase.Login(par1, par2, par3)
          '
        End Sub
      End Class
    End Namespace
    Namespace wsopfZZZ
      Friend Class opfZZZSoapClient
        Inherits opfXXXSoapBasis
        Public Sub New()
        End Sub
        Friend Overrides Sub Melden(par1 As String, par2 As String)
          MyBase.Melden(par1, par2)
          '
        End Sub
      End Class
    
    End Namespace


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    • Als Antwort markiert comscape Mittwoch, 11. Mai 2016 08:13
    Mittwoch, 4. Mai 2016 11:31

Alle Antworten

  • Hi,
    Du musst unterscheiden zwischen der Typisierung des Objektes und dem Konstruktor mit 2 formalen Parametern.

    In der Klassendeklaration kannst Du über eine Aufzählung 2 Typen angeben. Den Konstruktor kannst Du mit beliebig vielen Überladungen deklarieren. Die Anzahl und die Typen der formalen Parametern sind von den in der Klassendeklaration genannten Typen unabhängig, d.h., man kann die Typen nutzen, muss sie aber nicht nutzen.

    Das New in der Typliste (in der Klassen-Deklaration) hinter einem formalen Typ-Bezeichner sagt aus, dass der später bei der Instanziierung genutzte Typ einen parameterlosen Konstruktor haben muss.

    Hier noch ein Beispiel:

    Module Module1
    
      Sub Main()
        Dim c As New A(Of B, C)
    
        Console.ReadKey() ' Stopper
      End Sub
    
    End Module
    
    Friend Class A(Of T As New, V As New)
    
    End Class
    
    Friend Class B
      Public Sub New()
    
      End Sub
    
      Friend Sub New(par As Integer)
        '
      End Sub
    
    End Class
    
    Friend Class C
      Public Sub New()
    
      End Sub
      Friend Sub New(par As Integer)
        '
      End Sub
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut


    Mittwoch, 4. Mai 2016 10:04
  • Hallo,

    beim New musst Du dann konkretisieren, wie welchen Datentyp die Parameter haben:

    Public Class TwoGenerics(Of T1, T2)
    
        ' Erzeugen
        Public ReadOnly Instance As New TwoGenerics(Of Integer, String)(4711, "Eine Zeichenkette")
    
    
        Public Sub New(p1 As T1, p2 As T2)
            Property1 = p1
            Property2 = p2
        End Sub
    
        Private _property1 As T1
        Public Property Property1 As T1
            Private Set(value As T1)
                _property1 = value
            End Set
            Get
                Return _property1
            End Get
        End Property
    
        Public Property Property2 As T2
    End Class

    Etwas variiert um die Unterschiede/Möglichkeiten zu zeigen.

    Gruß Elmar

    Mittwoch, 4. Mai 2016 10:14
    Beantworter
  • Vielen Dank für Eure Antwort!

    Leider erschliesst sich für mich die Lösung noch nicht.
    Deswegen nochmals ein Stück Code, aus dem hervorgehen soll, was ich machen möchte.

    Ich möchte verschiedene WebService Typen instanziieren, sowie den Server mitgeben.

    Aufruf Varianten:
    Dim wsX1 As New wsConfig(Of wsopfXXX.opfXXXSoapClient)("localhost", 5689)
     wsX1.Service.Login(email, password, IdentificationID)

    Dim wsX2 As New wsConfig(Of wsopfXXX.opfXXXSoapClient)("wsopf.ServerDev02", Nothing)
     wsX2.Service.Login(email, password, IdentificationID)

    Dim wsZ1 As New wsConfig(Of wsopfZZZ.opfZZZSoapClient)("wsopf.ServerDev02",Nothing )
     wsZ1.Service.Melden(email, Text)


    Klasse:
    Public Class wsConfig(Of t As New)
      Dim _Service As t

      Public ReadOnly Property Service As t
        Get
          Return _Service
        End Get
      End Property

      Public Sub New(ByVal strHost As String, Optional ByVal strPort As String = Nothing)

        ...snip..

     Dim binding = New BasicHttpBinding()
        binding.Name = "WebService" & asmxName

     ...snip...

     Dim endpointStr = "http://" & strHost & strPort) & "/" & asmxName & ".asmx"    
        Dim endpoint = New EndpointAddress(endpointStr)

        '_Service = New wsopfXXX.opfXXXSoapClient(binding, endpoint)   das geht wenn nicht as t!
     _Service = New t(binding, endpoint)     ' hier habe ich das Problem ???
     ...
     
     Ich muss mit den zwei New Parametern instanzieren, da in der Konfigurationsdatei
     kein standardmäßiges Endpunktelement angeben wird.

    Das was ich bräuchte  müsste etwa so aussehen

    Public Class wsConfig(Of t As {New, BasicHttpBinding, EndpointAddress})

    • Bearbeitet comscape Mittwoch, 4. Mai 2016 11:26
    Mittwoch, 4. Mai 2016 11:06
  • Hi,
    die Lösung könnte so ausgesehen haben werden:

    Module Module1
    
      Sub Main()
        Dim email As String = String.Empty
        Dim password As String = String.Empty
        Dim IdentificationID As Integer = 0
        Dim Text As String = String.Empty
        Dim wsX1 As New wsConfig(Of wsopfXXX.opfXXXSoapClient)("localhost", 5689)
        wsX1.Service.Login(email, password, IdentificationID)
        Dim wsZ1 As New wsConfig(Of wsopfZZZ.opfZZZSoapClient)("wsopf.ServerDev02", Nothing)
        wsZ1.Service.Melden(email, Text)
        Console.ReadKey() ' Stopper
      End Sub
    
    End Module
    
    Friend Class wsConfig(Of T As New)
    
      Public Sub New(ByVal strHost As String, Optional ByVal strPort As Integer? = Nothing)
        _Service = New T
      End Sub
    
      Private _Service As T
    
      Public ReadOnly Property Service As T
        Get
          Return _Service
        End Get
      End Property
    End Class
    
    Friend MustInherit Class opfXXXSoapBasis
      Friend Overridable Sub Login(par1 As String, par2 As String, par3 As Integer)
      End Sub
      Friend Overridable Sub Melden(par1 As String, par2 As String)
      End Sub
    End Class
    
    Namespace wsopfXXX
    
      Friend Class opfXXXSoapClient
        Inherits opfXXXSoapBasis
        Public Sub New()
        End Sub
        Friend Overrides Sub Login(par1 As String, par2 As String, par3 As Integer)
          MyBase.Login(par1, par2, par3)
          '
        End Sub
      End Class
    End Namespace
    Namespace wsopfZZZ
      Friend Class opfZZZSoapClient
        Inherits opfXXXSoapBasis
        Public Sub New()
        End Sub
        Friend Overrides Sub Melden(par1 As String, par2 As String)
          MyBase.Melden(par1, par2)
          '
        End Sub
      End Class
    
    End Namespace


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    • Als Antwort markiert comscape Mittwoch, 11. Mai 2016 08:13
    Mittwoch, 4. Mai 2016 11:31
  • Danke für die Hilfe.

    Gruss

    Mittwoch, 11. Mai 2016 08:13