次のクラスは、ASP.NETアプリケーションで使用され、データベースの結果セットから通貨を読み取り、それらを合計します(たとえば、米ドルで合計を表示し、GBポンドで合計を表示します)。これは次のように機能します。
- 通貨ID値を読み取る
- 通貨IDがすでに存在する場合は、その通貨の合計を増やします
- 通貨IDが存在しない場合は、その値とともにリストに追加します
- 次
CurrencyID
これは、プロパティを各固有の通貨間の差別化要因として使用するとうまく機能します。IsoCurrencySymbol
ただし、デフォルトでは通貨ごとに一意であることが明らかになったため、CurrencyID
実際には必要ありません。
だから...このクラスから継承してへの参照を削除することが可能かどうか疑問に思っていたCurrencyID
ので、代わりにCompareTo
メソッドを使用IsoCurrencySymbol
します。
秘訣は、既存のクラスを広く使用されているままにして、変更されたバージョンを必要とせずCurrencyID
に導入することです。これは可能ですか?
<Serializable()> _
Public Class CurrencyCounter
<Serializable()> _
Private Class CurrencyType
Implements IComparable
Public IsoCurrencySymbol As String
Public CurrencySymbol As String
Public CurrencyID As Int16
Public Amount As Decimal
Public Function CompareTo(obj As Object) As Integer Implements System.IComparable.CompareTo
If Not TypeOf (obj) Is CurrencyType Then
Throw New ArgumentException("Object is not a currency type")
Else
Dim c2 As CurrencyType = CType(obj, CurrencyType)
Return Me.CurrencyID.CompareTo(c2.CurrencyID)
End If
End Function
End Class
Private _Currencies As List(Of CurrencyType)
Public Sub New()
_Currencies = New List(Of CurrencyType)
End Sub
Private Sub AddStructToList(CurrencyID As Integer, IsoCurrencySymbol As String, CurrencySymbol As String, Amount As Decimal)
If IsoCurrencySymbol <> String.Empty AndAlso Amount > 0 Then
Dim s As New CurrencyType
s.CurrencyID = CurrencyID
s.IsoCurrencySymbol = IsoCurrencySymbol
s.CurrencySymbol = CurrencySymbol
s.Amount = Amount
_Currencies.Add(s)
End If
End Sub
Public Sub Add(CurrencyID As Integer, IsoCurrencySymbol As String, CurrencySymbol As String, Amount As Decimal)
Dim ct As CurrencyType = _Currencies.Find(Function(obj) obj.CurrencyID = CurrencyID)
If ct IsNot Nothing Then
ct.Amount += Amount
Else
AddStructToList(CurrencyID, IsoCurrencySymbol, CurrencySymbol, Amount)
End If
End Sub
Public Sub Clear()
_Currencies.Clear()
End Sub
Public Function Count() As Integer
Return _Currencies.Count
End Function
Public Function RenderTotals() As String
' ...
End Function
End Class