Объект создан как суперкласс, хочу превратить его в подкласс

Мне дали библиотеку с общими объектами данных, проектами, таблицами, строками и полями. В моей программе у меня есть один проект под названием 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
Другие вопросы по тегам