通用类VB.NET
我遇到了一个关于泛型类的问题。我对如何使用参数调用构造函数感到困惑 我的界面:通用类VB.NET,vb.net,generics,class,inheritance,interface,Vb.net,Generics,Class,Inheritance,Interface,我遇到了一个关于泛型类的问题。我对如何使用参数调用构造函数感到困惑 我的界面: Public Interface IDBObject Sub [Get](ByRef DataRow As DataRow) Property UIN() As Integer End Interface 我的孩子班: Public Class User Implements IDBObject Public Sub [Get](ByRef DataRow As System.Da
Public Interface IDBObject
Sub [Get](ByRef DataRow As DataRow)
Property UIN() As Integer
End Interface
我的孩子班:
Public Class User
Implements IDBObject
Public Sub [Get](ByRef DataRow As System.Data.DataRow) Implements IDBObject.Get
End Sub
Public Property UIN() As Integer Implements IDBObject.UIN
Get
End Get
Set(ByVal value As Integer)
End Set
End Property
End Class
我的下一节课:
Public Class Users
Inherits DBLayer(Of User)
#Region " Standard Methods "
#End Region
End Class
我的DBObject类:
Public Class DBLayer(Of DBObject As {New, IDBObject})
Public Shared Function GetData() As List(Of DBObject)
Dim QueryString As String = "SELECT * ***;"
Dim Dataset As DataSet = New DataSet()
Dim DataList As List(Of DBObject) = New List(Of DBObject)
Try
Dataset = Query(QueryString)
For Each DataRow As DataRow In Dataset.Tables(0).Rows
**DataList.Add(New DBObject(DataRow))**
Next
Catch ex As Exception
DataList = Nothing
End Try
Return DataList
End Function
End Class
我在DBLayer对象的星号区域中得到错误
可能的原因是什么?我能做些什么来修复它
我甚至想在IDBObject接口中添加新的(byval-someval作为数据类型)用于重载构造。但它也给出了一个错误?我怎么做
添加
IDBObject中的Sub New(ByVal DataRow作为DataRow)产生以下错误
无法在接口中声明“Sub New”
DBLayer对象中产生错误
行:DataList.Add(新的DBObject(DataRow))
Msg:无法将参数传递给类型参数上使用的“New” 这并不像对你所指的东西感到困惑那么简单?您有一行“For Each DataRow As DataRow”,这似乎会引起混淆,可能是当您在构造函数中引用DataRow时,它没有使用循环变量,而是使用数据类型“DataRow”。即使这不是问题所在,您也可能希望将循环变量更改为不那么模棱两可的变量 您得到的实际错误是什么
另外,对于添加额外构造函数的最后一部分,您会遇到什么错误?如果要向接口添加某个符号,是否要向实现接口的每个符号添加额外的构造函数?对于构造函数,这是因为无法在接口中定义构造函数 编辑: 我明白你现在想做什么了。您希望创建定义DBLayer的泛型类型的新实例。您的问题是,您不能指定接口的实现需要有一个特定的构造函数。您最好在接口上有一个方法,该方法接受数据行并使用它初始化IDBObject,然后您可以创建DBObject类型的实例,然后调用接受数据行的方法来初始化实例 或者,您可以要求DBLayer类采用factory类,该类可以在给定DataRow的情况下生成DBObject类型的对象,并且您可以调用factory的此方法来代替调用
For Each rowAs DataRow In Dataset.Tables(0).Rows
//DataList.Add(New DBObject(row))
DataList.Add(m_factory.CreateObject(row));
Next
编辑2:
最简单的方法是扩展接口,允许您设置DataRow并在循环中调用方法:
For Each row As DataRow In Dataset.Tables(0).Rows
//DataList.Add(New DBObject(row))
Dim newElement As IDBObject = CType(Activator.CreateInstance(GetType(DBObject)), IDBObject)
//you'll need to add this SetDataRow method the the IDBObject interface
newElement.SetDataRow(row)
DataList.Add(newElement)
Next
问题在于新的约束。它只承诺一个无参数的构造函数,编译器无法推断DbObject类型参数可能有一个以DataRow为参数的构造函数
您也许可以使用获取/设置数据行的属性来扩展IDbObject接口。类工厂会很有帮助。如果使用抽象类而不是接口对象,会怎么样?然后应该继承而不是实现。
抽象类可以定义所需的构造函数。这不是循环错误。。。我已经添加了正在产生的错误,所以如果我想做数据列表之类的事情,可以做什么。添加(New DBObject(DataRow))选择不同的名称并不能解决关于m)工厂或类工厂的问题。。。我不是太高水平的程序员。。。需要一些更基本的概念。。。你们能不能像u说的那个样详细解释一下它,但它仍然说了一些错误,比如:“Option Strict On不允许从‘IDBObject’到‘DBObject’的隐式转换”。我在IDBObject中为setDataRow添加了一个新的子对象(byval DataRow作为DataRow),请尝试使用
CType
而不是DirectCast
,或者在代码顶部关闭选项strict以查看它是否有效。我的VB不是很好,抱歉。当我们做泛型时,可以使用抽象类吗。。。任何发布或代码示例?您可以使用抽象类(在Vb.Net中,关键字为MustInherit)代替接口。定义泛型类时,只需将类型约束为基类型。在这里,接口与抽象类相同。虽然这个想法还可以,但不能保证实现类将包含您想要的构造函数,它可能会向构造函数添加额外的参数,因此您将无法使用DataRow调用构造函数,从而确保它不会失败。唯一可以保证的是,在类型上使用New
约束时,默认构造函数将存在。