2012-11-08 68 views
1

我已經實現IDataReader的和需要的功能的類中寫的,但我得到一個錯誤信息,說明如何在不重新輸入所有方法的情況下實現IDataReader?

班「CSVDataReader」必須實現「功能GetBoolean(我作爲整數)爲布爾」的接口「系統.Data.IDataRecord」。

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 
+0

在VS中,您應該能夠右鍵單擊代碼中的接口名稱,然後選擇「實現接口」。這將爲您排除所有接口方法。適用於C#,我認爲VB也支持它。 – Jason

+0

不幸的是,VB沒有那麼多重構優點(至少我上次看過;也許後來的版本更好)。 – prprcupofcoffee

回答

1

你必須實現所有的方法和屬性。

接口是一個契約 - 如果一個對象說它可以提供界面上列出的服務,它必須提供所有這些服務。一個接口不是一個基類 - 如果你沒有實現某些東西,就沒有「模板」代碼可以重用。

可以不在你不感興趣的方法/屬性中加入任何代碼(我通常會把Throw New NotImplementedException放在裏面,這樣我就知道什麼時候我不經意地調用了一個我不打算的方法)。但存根必須在那裏。

+1

當您鍵入'Implements IDataReader'後,Visual Studio應該使用存根填充您的類。如果沒有,請嘗試刪除該行並重新輸入該行,確保按行末尾的Enter鍵。如果您鍵入該行,然後只需單擊文件中的其他位置,Visual Studio將不會自動填充您的類。 – prprcupofcoffee

+0

謝謝。我會嘗試。 – masteroleary

+0

所以我這樣做了,許多意味着返回值的自動生成函數沒有返回語句。你有什麼建議? – masteroleary

相關問題