Универсальный класс VB.NET - PullRequest
0 голосов
/ 01 июня 2010

Я застрял с проблемой общих классов. Я запутался, как я вызываю конструктор с параметрами.

Мой интерфейс:

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.

В чем может быть причина? что я могу сделать, чтобы это исправить?

Я даже хочу добавить New (byval someval как datatype) в интерфейс IDBObject для перегрузки конструкции. но это также дает ошибку? как я могу это сделать?

Добавление

Sub New (ByVal DataRow As DataRow) в процессе IDBObject после ошибки «Sub New» не может быть объявлено в интерфейсе.

Ошибка в объекте DBLayer строка: DataList.Add (New DBObject (DataRow)) Сообщение: Аргументы не могут быть переданы в 'New', используемый в параметре типа.

Ответы [ 4 ]

1 голос
/ 01 июня 2010

Проблема с новым ограничением. Он только обещает конструктор без параметров, компилятор не может сделать вывод, что параметр типа DbObject может иметь конструктор, который принимает DataRow в качестве аргумента.

Возможно, вы могли бы расширить интерфейс IDbObject с помощью свойства, которое получает / устанавливает DataRow. Фабрика классов была бы полезна.

0 голосов
/ 01 июня 2010

Что если вы используете абстрактный класс вместо интерфейса IDBObject? Затем вы должны наследовать вместо реализации. Абстрактный класс может определять необходимый конструктор.

0 голосов
/ 01 июня 2010

для конструктора, потому что вы не можете определить конструктор в интерфейсе.

EDIT:

Я вижу, что вы пытаетесь сделать сейчас. Вы хотите создать новый экземпляр универсального типа, с которым определен ваш DBLayer. Ваша проблема заключается в том, что вы не можете указать, что ваши реализации интерфейса должны иметь определенный конструктор. Возможно, вам лучше иметь метод на вашем интерфейсе, который принимает DataRow и использует его для инициализации IDBObject, затем вы можете создать экземпляр типа DBObject и затем вызвать метод, который принимает DataRow, с помощью которого можно инициализировать ваш экземпляр.

Или вы могли бы потребовать, чтобы ваш класс DBLayer принял класс фабрики, который может создать объект типа DBObject с данным DataRow, и вы могли бы вызвать этот метод фабрики вместо вызова

        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
0 голосов
/ 01 июня 2010

Это не так просто, как запутаться в том, что вы имеете в виду? У вас есть строка «For Each DataRow As DataRow», которая выглядит как рецепт путаницы, и может случиться так, что когда вы ссылаетесь на DataRow в своем конструкторе, он использует не переменную цикла, а тип данных «DataRow». Даже если это не проблема, вы, вероятно, захотите изменить переменную цикла на что-то менее двусмысленное.

Какую ошибку вы получаете?

Также для последней части добавления дополнительных конструкторов, какую ошибку вы получаете? Если вы добавляете что-то в интерфейс, добавляете ли вы дополнительный конструктор в каждый объект, который реализует интерфейс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...