2016-08-03 32 views
0

Ich habe den folgenden Code. Eine Klasse, die einem FondsWie Sie identische Eigenschaften auf .NET-Klasse wiederverwenden

Public Class FundElement 
    Public Name As New FundDetail 
    Public Price As New FundDetail 
    Public Code As New CodeDetail 
End Class 

eine Basisklasse für jedes einzelne Datenfeld

Public Class FundDetail 
    Protected _value As String 

    Public Property value As String 
     Get 
      Return _value 
     End Get 

     Set(valueToAssign As String) 
      If isValid(valueToAssign) Then 
       _value = valueToAssign 
      Else 
       Throw New ArgumentException 
      End If 
     End Set 
    End Property 

    Shared Function isValid(detail As String) As Boolean 
     Return True 
    End Function 
End Class 

Und einige geerbte Klassen halten wird, die Logik für bestimmte Felder halten wird. Aus diesem Grund wollte ich für jedes Feld eine Klasse und nicht nur eine Zeichenfolge.

Public Class CodeDetail 
    Inherits FundDetail 

    Public Shared Shadows Function isValid(value As String) As Boolean 
     Dim intPattern As Regex = New Regex("[a-zA-Z]{3}[0-9]{12}") 
     Return intPattern.IsMatch(value) 
    End Function 
End Class 

Nun ist mein Problem, dass die API für meine Klasse ist als

Dim fund as new FundElement 

FundElement.Name.Value = "Google Inc" 
FundElement.Code.Value = "USD451234151234" 

folgt was bedeutet, dass Programmierer Zugriff auf das NAV-Element, die ich vollständig ausblenden möchten. Und die API ist ausführlicher als sie sein muss. Ich möchte, dass die Schnittstelle sein, wie

FundElement.Name = "Google Inc" 
FundElement.Price = "USD451234151234" 

folgt kann ich dies implementieren, indem die Klasse zu ändern, so dass jede fundDetail Instanz privat ist, und durch eine neue Eigenschaft hinzugefügt als

Public Class FundElement 

    Private _Name As New FundDetail 
    Public Property Name As String 
     Set(valueToAssign As String) 
      _Name.value = valueToAssign 
     End Set 
     Get 
      Return _Name.value 
     End Get 
    End Property 

    Private _Code As New FundDetails 
    Public Property _Code As String 
     Set(valueToAssign As String) 
      _Code.value = valueToAssign 
     End Set 
     Get 
      Return _Code.value 
     End Get 
    End Property 

    Private _Price As New PriceDetail 
    Public Property _Price As String 
     Set(valueToAssign As String) 
      _Price.value = valueToAssign 
     End Set 
     Get 
      Return _Price.value 
     End Get 
    End Property 

End Class 

Nun folgt das endete sehr ausführlich für nur 3 Mitglieder. Darüber hinaus war der Code für jede Eigenschaft fast identisch. Es ist mühsam zu tippen und unordentlich zu lesen.

Gibt es eine Möglichkeit, dies zu erreichen, ohne die Eigenschaften jedes Mal eingeben zu müssen, wenn ich ein neues Mitglied hinzufügen möchte?

+0

Warum immer einen String würde schätzen? Regex zum Testen auf numerische – Paparazzi

+1

Warum überschatten Sie Ihre Methode? Wäre es nicht besser, die ursprüngliche Methode 'Overridable' zu ​​markieren und in der geerbten Methode' Overrides' zu markieren? –

+0

Da überschreibbare Funktionen nicht gemeinsam genutzt werden können. –

Antwort

0

Warum würde Wert immer Zeichenfolge sein?
Ich bin besser in C#

Public Class FundElement 
{ 
    Public String Name { get; set; } 
    Public Decimal Price { get; set; } 
    Public Int32 Shares { get; set; } 
} 
+0

Werte sollten immer als Strings gelesen werden. Der Benutzer sollte in der Lage sein, Fund.Shares = "243.45" zu tun, anstatt ihn dazu zu zwingen, Fund.Shares = toInt32 ("243.45") Außerdem werden viele der Prüfungen, die ich implementieren muss, auf Strings implementiert werden Überprüfen, ob eine Zeichenfolge am Anfang 12 numerische Zeichen und 3 Buchstaben hat. –

+1

Werte sollten nicht immer als String gelesen werden. Regex "^ \ d * $" wird nicht erlaubt 243.45. Sie könnten dezimal verwenden. Sie haben gefragt, wie Sie den Code vereinfachen und Ihnen zeigen können. – Paparazzi

+0

Ich meine, dass die Quelldateien immer Zeichenfolgen sind. Wenn sie also als Strings gespeichert werden, muss irgendwo eine Konvertierung stattfinden. Zusätzlich ist dies die einfachste der Gültigkeitsprüfungen, nach denen ich suche. Ich werde die Beispielregex für eine ersetzen, die nicht durch native Datentypen ersetzt werden kann. –