【问题标题】:How to implement IDataReader without retyping all the methods?如何在不重新输入所有方法的情况下实现 IDataReader?
【发布时间】:2023-03-11 20:15:01
【问题描述】:

我有一个实现 IDataReader 的类并编写了所需的函数,但我收到一条错误消息说明

类“CSVDataReader”必须为接口“System.Data.IDataRecord”实现“Function GetBoolean(i As Integer) As Boolean”。

IDataReader 具有许多功能和属性。如何在不全部重写的情况下实现这些功能?

这是我的课

    Public Class CSVDataReader
    Implements IDataReader
    Private stream As StreamReader
    Private columnsByName As New Dictionary(Of String, Integer)()
    Private columnsByOrdinal As New Dictionary(Of Integer, String)()
    Private currentRow As String()
    Private _isClosed As Boolean = True

    Public Sub New(fileName As String)
        If Not File.Exists(fileName) Then
            Throw New Exception("File [" & fileName & "] does not exist.")
        End If

        Me.stream = New StreamReader(fileName)

        Dim headers As String() = stream.ReadLine().Split(",")
        For i As Integer = 0 To headers.Length - 1
            columnsByName.Add(headers(i), i)
            columnsByOrdinal.Add(i, headers(i))
        Next

        _isClosed = False
    End Sub

    Public Sub Close()
        If stream IsNot Nothing Then
            stream.Close()
        End If
        _isClosed = True
    End Sub

    Public ReadOnly Property FieldCount() As Integer
        Get
            Return columnsByName.Count
        End Get
    End Property

    ''' <summary>
    ''' This is the main function that does the work - it reads in the next line of data and parses the values into ordinals.
    ''' </summary>
    ''' <returns>A value indicating whether the EOF was reached or not.</returns>
    Public Function Read() As Boolean
        If stream Is Nothing Then
            Return False
        End If
        If stream.EndOfStream Then
            Return False
        End If

        currentRow = stream.ReadLine().Split(",")
        Return True
    End Function

    Public Function GetValue(i As Integer) As Object
        Return currentRow(i)
    End Function

    Public Function GetName(i As Integer) As String
        Return columnsByOrdinal(i)
    End Function

    Public Function GetOrdinal(name As String) As Integer
        Return columnsByName(name)
    End Function

    Public Function GetOrdinal(name As String) As Integer
        Return columnsByName(name)
    End Function
End Class

【问题讨论】:

  • 在 VS 中,您应该能够右键单击代码中的接口名称并选择“实现接口”。这将为您排除所有接口方法。适用于 C#,我假设 VB 也支持它。
  • 可悲的是,VB 没有那么多重构的优点(至少我上次看的时候;也许以后的版本会更好)。

标签: asp.net vb.net class implements


【解决方案1】:

你必须实现所有的方法和属性。

接口是一种契约——如果一个对象说它可以提供接口上列出的服务,它必须提供所有这些服务。接口不是基类——如果你不实现某些东西,就没有“模板”代码可以依赖。

不要在您不感兴趣的方法/属性中添加任何代码是可以的(我通常会输入Throw New NotImplementedException,所以我知道何时无意中调用了我不打算调用的方法)。但是存根必须在那里。

【讨论】:

  • 当您在键入Implements IDataReader 后按下Enter 键时,Visual Studio 应该已经用存根填充了您的类。如果没有,请尝试删除该行并重新输入,确保在行尾按下Enter 键。如果您键入该行,然后单击文件中的其他位置,Visual Studio 将不会自动填充您的类。
  • 所以我这样做了,许多旨在返回值的自动生成函数没有返回语句。你有什么建议?
  • 虽然VS将其显示为错误,但当我上传它时它并没有抛出错误。问题解决了。
  • 如果你输入我提到的Throw 语句,VS 将停止告诉你该方法没有返回值。或者,您可以输入Return Nothing。 (在 Visual Basic 中,Nothing 是类型的默认值,因此无论方法返回引用类型(例如 Object)还是值类型(例如 Integer),Return Nothing 都将起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2011-04-30
  • 2010-12-29
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多