【发布时间】:2018-09-28 09:44:58
【问题描述】:
我创建了一个类CFileInfo,它继承自抽象FileSystemInfo 类。我的构造函数将一个新的FileInfo 对象分配给一个类范围的变量。
必须覆盖 3 个成员(Name、Exists、Delete)。
但是,其他成员未在基类中声明 Overridable,例如 CreationTime。但是由于抽象类无论如何都不包含对象,所以我应该能够简单地重载这个属性,还是我在这里弄错了?我这样做了,也为了只读的Name 属性。
Public Class CFileInfo
Inherits FileSystemInfo
Private goFile As FileInfo
Public Sub New(ByVal sFileName As String)
goFile = New FileInfo(sFileName)
End Sub
Public Overrides ReadOnly Property Exists As Boolean 'Mustoverride member.
Get
Return goFile.Exists
End Get
End Property
Public Overrides ReadOnly Property Name As String 'Mustoverride member.
Get
Return goFile.Name
End Get
End Property
Public Overrides Sub Delete() 'Mustoverride member.
goFile.Delete()
End Sub
Public Overloads ReadOnly Property FullName As String 'Works as intended.
Get
Return goFile.FullName
End Get
End Property
Public Overloads Property CreationTime As Date
Get 'Does not work. Why?
Return goFile.CreationTime
End Get
Set(oValue As Date)
goFile.CreationTime = oValue
End Set
End Property
End Class
一个类CMultiFile继承自上面的CFileInfo。在其中,我基于FileInfo 对象创建了一个物理文件。 (生成的FileStream 会一直保留到Finalize 处理它。)
Public Class CMultiFile
Inherits CFileInfo
Private goMultiFileStream As FileStream
Public Sub New(ByVal sFileName As String)
MyBase.New(sFileName)
goMultiFileStream = MyBase.Create()
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
goMultiFileStream.Dispose()
End Sub
End Class
使用CMultiFile 的类(在我的例子中是一个Win Form)创建了一个CMultiFile 的实例,它确实按预期创建了文件。
FileInfo 对象现在应该提供有关与其关联的文件的信息,正确。只是它并不适用于所有成员。
Public Class FMain
Private goMultiFile As CMultiFile
Private Sub cButton_Click(sender As Object, e As EventArgs) Handles cButton.Click
Dim sMultiFileName As String = "Test.mfw"
goMultiFile = New CMultiFile(sMultiFileName)
MsgBox(goMultiFile.FullName & " created at " &
goMultiFile.CreationTime.ToString)
End Sub
End Class
为什么(重载的)FullName 属性会产生有效的完整路径值,而(也重载的)CreationTime 属性不会? (它包含#1/1/1601 01:00:00 AM#)
在返回属性 FullName 和 CreationTime 时在 CFileInfo 中设置两个 Stop 会显示,输入 FullName 并因此返回正确的值,而 CreationTime 甚至没有输入 .
是什么导致了这种行为?如何访问我的CFileInfo 类的所有成员?
【问题讨论】:
-
当您的类本质上委托给 FileInfo 时,从 FileSystemInfo 继承有什么意义?只需使用 FileInfo 及其流。如果你想用额外的方法来扩展它,添加一个方法扩展
-
顺便说一句,FileInfo 是一个文件信息,而不是流的包装器。流应该不无故保留。在这种情况下,您正在创建一个文件并长时间保持打开和锁定状态。你想用这段代码做什么?为什么不直接使用例如 FileInfo.Create 或 Open 创建流本身?您是否正在尝试创建日志?还是锁定文件?
标签: .net vb.net inheritance abstract-class fileinfo