Конструкторы VB.NET в производных классах

У меня есть базовый класс, который я использую с отражением для заполнения полей производных классов, читая из базы данных.

Public MustInherit Class DaoBase : Implements IEquatable(Of DaoBase)

        Sub New()
               ' Empty, hate to have it
        End Sub

        Sub New(reader As DbDataReader)
              '  Reads the DB and fills the instance fields
        End Sub

        '  More stuff...
End Class

Производные классы обычно имеют конструктор не по умолчанию для установки своих полей:

Public Class Customer
        Inherits DaoBase

        Public Sub New(
            id As Integer,
            description As String)

            Me.id = id
            Me.description = description 
        End Sub

End Class

Вопросы:

1) Мне не нравится иметь пустой конструктор в базовом классе. Он остается там неиспользованным и может создать объект в неправильном состоянии. Если я удалю его, компилятор выдаст ошибку, потому что конструктор производного класса без конструктора по умолчанию должен вызывать только один конструктор базового класса.

2) Я не могу сделать new Customer(myReader), потому что этот конструктор не находится в производном классе, даже если он находится в базовом классе. Я должен явно объявить это, что мне не нравится.

Public Class Customer
        Inherits DaoBase

        Public Sub New(
            id As Integer,
            description As String)

            Me.id = id
            Me.description = description 
        End Sub

        Public Sub New(reader As DbDataReader)
            MyBase.New(reader)
        End Sub 

End Class

person vulkanino    schedule 15.01.2014    source источник
comment
Вы пробовали что-то вроде Sub New(reader As DbDataReader = Nothing) и удалить пустой конструктор.   -  person Jade    schedule 15.01.2014
comment
Вы пробовали что-то вроде Entity Framework вместо того, чтобы изобретать велосипед?   -  person John Saunders    schedule 15.01.2014
comment
@JohnSaunders Когда колесо слишком сложное и содержит ошибки, полезно его заново изобрести.   -  person vulkanino    schedule 15.01.2014
comment
Извините, EF: сложно и глючно? Ты шутишь, да? После шести версий?   -  person John Saunders    schedule 15.01.2014


Ответы (1)


Если ваш базовый класс заполняет поля в производном классе, похоже, вы должны использовать интерфейс, а не то, что вы делаете.

Что касается ваших вопросов, то, что вам это не нравится, не делает это неправильным. Но, как сказал один комментарий, если вы измените второй New на:

Sub New(Optional reader as DbDataReader = Nothing)

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

person JonS    schedule 06.10.2016