2016-08-03 13 views
0

次のコードがあります。ファンド.NETクラスで同じプロパティを再利用する方法

Public Class FundElement 
    Public Name As New FundDetail 
    Public Price As New FundDetail 
    Public Code As New CodeDetail 
End Class 
個々のデータフィールドの

基底クラス

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 

そして、いくつかは、特定の分野に固有のロジックを保持するクラスを継承を保持するクラス。これは、各フィールドの単なる文字列ではなく、クラスを求めていた理由です。

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 

は今、私の問題は、コーダーは、私は完全に非表示にするNAV要素へのアクセス権があることを意味し

Dim fund as new FundElement 

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

を次のように私のクラスのためのAPIであるということです。 APIは、必要以上に冗長です。私は、各fundDetailインスタンスがプライベートであるように、私は、クラスを変更することでこれを実装することができます

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

を次のようにインターフェースになりたい、と

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 

を次のように新しいプロパティを追加することによって、今、これは終わりましたわずか3人のメンバーのために非常に冗長です。さらに、各プロパティのコードはほとんど同じでした。入力するのが面倒で、読むのが面倒です。

新しいメンバーを追加するたびにプロパティを入力しなくても、これを達成できる方法はありますか?

+0

なぜ文字列を常に値になりますで、より良いのですか?正規表現で数値を調べる – Paparazzi

+1

なぜあなたのメソッドをシャドウしていますか?元のメソッドを「オーバーライド可能」とマークし、継承したメソッドに「オーバーライド」をマークする方が良いでしょうか? –

+0

オーバーライド可能な関数は共有できないためです。 –

答えて

0

なぜ値は常に文字列ですか?
私はC#

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

値は常に文字列として読み取る必要があります。ユーザーはFund.Shares = toInt32( "243.45")を実行するよう強制するのではなく、Fund.Shares = "243.45"を実行できるはずです。さらに、実装する必要のあるチェックの多くは、次のような文字列で実装されます。開始時に文字列に12文字と3文字が含まれているかどうかを確認します。 –

+1

値は常に文字列として読み取られるべきではありません。正規表現 "^ \ d * $"は許可されません243.45。小数を使うことができます。あなたはコードを単純化する方法を尋ね、あなたを示しました。 – Paparazzi

+0

私はソースファイルが常に文字列になることを意味します。したがって、文字列として格納される場合、変換はどこかで行われなければなりません。 さらに、これは私が探している最も単純な妥当性チェックです。ネイティブデータ型に置き換えることのできない正規表現の例を置き換えます。 –

関連する問題