通用类VB.NET

时间:2010-06-01 11:44:45

标签: 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.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)) 消息:参数不能传递给类型参数上使用的“新”。

4 个答案:

答案 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,该怎么办?然后你应该继承而不是实现。 抽象类可以定义所需的构造函数。