我有一个对象compactUser超类的,我想创建一个对象detailedUser基于对象的子类型的compactUser ,在一种安全的方式。 我有一个可行的解决方案,下面的代码中的detailedUser1 ,但是我想针对更复杂的场景提供一些更灵活的方法(以及detailedUser2 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我得到了一个包含通用数据对象的库,即项目,表,行和字段。 在我的程序中,我有一个名为Building的项目,其表1包含“ Units”,表1的字段1是“ Unitname”。 所以我做了...
Public Class Unit
Private myRow As Row
Public Sub New(ByRef R as Row)
myRow = Row
End Sub
Public Function Unitname() as String
Return myRow.Fields(1)
End Function
... etc ...
End Class
看起来还不错吗? 但是我没有加载Unit对象,而是Rows。 所以我还得再上一堂课...
Public Class Building
Private myProj as Project
...
Public Function Units() As List(Of Unit)
Dim ans as New List(Of Unit)
For Each R In myProj.Tables(1).Rows
ans.Add(new Unit(R))
Next
Return ans
' or I could use myProj.Tables(1).Rows.ConvertTo(Of Unit)
End Function
...etc...
当然,我必须列出建筑物列表,这样才能得到单元列表以及其他数十个列表和访问器,这变成了数千行代码,它们的唯一目的是制作一组指向的对象另一个。
它有效,我知道运输是一项功能。 但是我真正想做的是制作一个看起来像...的单位
Public Class Unit
Inherits Row
...
End Class
然后,我会将列表(行)“反向转换”为列表(单元)。 这不仅会消除大量代码,还将消除悬空的指针,减少大量内存,并消除可能花费一些时间的设置集。 从理论上讲,除了代码没有什么区别,但是我看不到VB.Net中的一种实现方法。
在Obj-C中,这称为swizzling(和/或扩展),我认为Java也有类似的概念。 我怀疑ADO.Net必须做这样的事情吗? 我缺少某种“将其包装”功能吗?
节省大量时间并使用数据集。 对于数据库应用程序,面向对象的编程不能很好地工作。 数据集只能是内存中的,不需要数据库引擎。
Dim dsProject As New DataSet("Project")
Dim dtUnits As New DataTable("Units")
dtUnits.Columns.Add("Unitname", GetType(String))
dtUnits.Columns.Add("Address", GetType(String))
dsProject.Tables.Add(dtUnits)
dtUnits.Rows.Add("Unit 1", "1 Test Street")
dtUnits.Rows.Add("Unit 2", "2 Sample Avenue")
dtUnits.Rows.Add("Unit 3", "3a Demo Road")
Dim drMatch() As DataRow = dtUnits.Select("Unitname='Unit 1'")
If drMatch.GetUpperBound(0) >= 0 Then
MsgBox(drMatch(0).Item("Address"))
Else
MsgBox("No matching record")
End If
如果您不想使用数据集,则可以尝试使用共享转换器函数:
Class unit
Inherits row
Public Property UnitName() As String
Get
Return fields(1)
End Get
Set(ByVal value As String)
fields(1) = value
End Set
End Property
Shared Function UnitToRow(u As unit) As row
Return DirectCast(u, row)
End Function
Shared Function RowToUnit(r As row) As unit
Dim u As New unit
u.fields = r.fields
Return u
End Function
End Class
Sub usage()
Dim lstR As New List(Of row) '<--- source data
Dim lstU As List(Of unit) = lstR.ConvertAll(New Converter(Of row, unit)(AddressOf unit.RowToUnit))
MsgBox(lstU(0).UnitName)
lstU(0).UnitName = "xxx"
Dim lstR2 As List(Of row) = lstU.ConvertAll(New Converter(Of unit, row)(AddressOf unit.UnitToRow))
MsgBox(lstR2(0).fields(1))
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.