0

Projects、Tables、Rows、および Fields という汎用データ オブジェクトを含むライブラリが提供されました。私のプログラムには、Building という単一のプロジェクトがあり、そのテーブル 1 には「ユニット」が含まれ、テーブル 1 のフィールド 1 は「ユニット名」です。それで私がしたことは...

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 オブジェクトをロードしていません。Row を持っています。それで、別のクラスも作成する必要があります...

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...

そしてもちろん、Units のリスト、およびその他の数十のリストとアクセサーを取得できるように、建物のリストを作成する必要があります。別。

それは機能し、配送が機能であることを知っています. しかし、私が本当にやりたいのは、次のようなユニットを作成することです...

Public Class Unit
  Inherits Row
  ...
End Class

次に、List(Of Row) を List(Of Unit) に「逆キャスト」します。これにより、多くのコードが削除されるだけでなく、ダングリング ポインターが削除され、メモリが大幅に削減され、時間がかかるセットアップ セットが削除されます。理論的には可能ですが、コード以外に違いはありませんが、VB.Net でそれを行う方法がわかりません。

Obj-C では、これはスウィズリング (および/または拡張機能) と呼ばれ、Java にも同様の概念があると思います。ADO.Net はこのようなことをしなければならないと思いますか? 私が見逃している「これをその中にラップする」機能はありますか?

4

2 に答える 2

0

時間を大幅に節約し、DataSet を使用してください。データベース アプリの場合、オブジェクト指向プログラミングはあまりうまく機能しません。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
于 2015-01-15T00:45:50.460 に答える