Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通用类VB.NET_Vb.net_Generics_Class_Inheritance_Interface - Fatal编程技术网

通用类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
约束时,默认构造函数将存在。