繁体   English   中英

对象被创建为超类,想要将其变成子类

Object was created as a superclass, want to turn that into a subclass

提示:本站收集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必须做这样的事情吗? 我缺少某种“将其包装”功能吗?

2 个回复

节省大量时间并使用数据集。 对于数据库应用程序,面向对象的编程不能很好地工作。 数据集只能是内存中的,不需要数据库引擎。

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
1 如何基于超类型的对象创建子类型的对象?

我有一个对象compactUser超类的,我想创建一个对象detailedUser基于对象的子类型的compactUser ,在一种安全的方式。 我有一个可行的解决方案,下面的代码中的detailedUser1 ,但是我想针对更复杂的场景提供一些更灵活的方法(以及detailedUser2 ...

2 在Java中将子类的对象创建为超类的实例

例如,我有以下代码(这是一个测验问题,因此我可以在IDE中运行它,但是我不清楚它的工作逻辑): 输出将如下所示: 用A做某事 用A做某事 用A做某事 因此,我的第一个问题是:声明的含义是什么 即,为什么要创建一个将其声明为类A的实例的类B的对象? 与声明 ...

4 创建超类的实例并将其值馈送到其子类?

我创建了一个类,该类为api(键,区域)添加了一些变量。 我创建了其他扩展了该类的类,并利用超类中的数据访问api端点。 我定义了这样的类: 我的问题是,在调用这些类时,是否可以定义超类,而不必插入其变量,如: 因为当我定义子类时,构造函数如下所示: 对我来说,当我想 ...

5 超类的对象变成了arraylist?

我正在学习Java,我遇到了一些我无法理解或解决的问题! 我刚刚学习了继承和抽象方法。 所以我做了一个超级类,我称之为Account,然后是两个子类,我称之为savingsAccount和creditAccount。 我还将子类的对象放入两个单独的arraylist中。 但现在我必须 ...

2011-12-31 11:33:10 3 2268   java
8 将超类的对象转换为子类的对象会创建一个新对象吗?

假设我有一个超类Item和一个子类MovingItem。 如果创建项目数组,然后尝试将已经创建的项目之一转换为MovingItem并将其存储到向量中,这是否意味着我使用了引用或创建了一个新对象。 当我将在数组itms中位于索引0处的Itm类型的对象转换为向量并将其存储到向量中时会发 ...

10 超类引用子类对象?

给我一个我们需要在Java中使用超类引用子类对象的情况。请给我一个实时的例子。 谢谢 ...

2010-03-29 02:53:10 9 26956   java/ oop
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM