Объект создан как суперкласс, хочу превратить его в подкласс
Мне дали библиотеку с общими объектами данных, проектами, таблицами, строками и полями. В моей программе у меня есть один проект под названием Building, его таблица 1 содержит "Units", а поле 1 в Table 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
Это не выглядит так плохо, не так ли? Но у меня нет загруженных объектов юнитов, у меня есть ряды. Итак, я также должен сделать еще один класс...
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 должен сделать что-то вроде этого? Есть ли какая-то функция "обернуть это", которую мне не хватает?
2 ответа
Если вы не хотите использовать DataSets, вы можете попробовать использовать функцию общего конвертера:
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
Сэкономьте много времени и используйте DataSet. Для приложений баз данных объектно-ориентированное программирование работает не слишком хорошо. Наборы данных могут быть только в памяти и не нуждаются в ядре базы данных.
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