我遇到了关于泛型类的问题。我很困惑如何使用参数调用构造函数。
我的界面:
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接口中添加New(byval someval as datatype)来重载构造。但它也会出错?我怎么能这样做?
添加
IDBObject产品中的Sub New(ByVal DataRow As DataRow)跟随错误 无法在界面中声明“Sub New”。
在DBLayer对象中生成错误 line:DataList.Add(New DBObject(DataRow)) 消息:参数不能传递给类型参数上使用的“新”。
答案 0 :(得分:1)
问题在于新约束。它只承诺一个无参数的构造函数,编译器不能推断出DbObject类型参数可能有一个以DataRow作为参数的构造函数。
您可以使用获取/设置DataRow的属性扩展IDbObject接口。一个班级工厂会很有帮助。
答案 1 :(得分:0)
它不是因为你所指的是什么而感到困惑吗?你已经得到了“For DataRow As DataRow”这一行似乎是一个混乱的秘诀,当你在构造函数中引用DataRow时,它可能不是使用你的循环变量而是使用数据类型“DataRow”。即使这不是问题,您可能希望将循环变量更改为不那么模糊的东西。
你得到的实际错误是什么?
另外,对于添加额外构造函数的最后一部分,您会得到什么错误?如果要向接口添加somethign,您是否将额外的构造函数添加到实现接口的每个签名?
答案 2 :(得分:0)
用于构造函数,这是因为您无法在接口中定义构造函数。
编辑:
我看到你现在要做的事情。您想要创建一个定义了DBLayer的泛型类型的新实例。您的问题是您无法指定您的接口实现需要具有特定的构造函数。您可能最好在接口上接受DataRow并使用它来初始化IDBObject,然后您可以创建DBObject类型的实例,然后调用接受DataRow的方法来初始化您的实例。
或者您可以要求您的DBLayer类采用一个工厂类,该工厂类可以在给定DataRow的情况下生成DBObject类型的对象,并且您可以调用此工厂的方法来代替调用
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
答案 3 :(得分:0)
如果使用抽象类而不是接口IDBObject,该怎么办?然后你应该继承而不是实现。 抽象类可以定义所需的构造函数。