我创建了一个继承自CFileInfo
类的类FileSystemInfo
。我的构造函数将一个新的FileInfo
对象分配给一个类范围的变量。
必须覆盖3个成员(Name
,Exists
,Delete
)。
但是,其他成员未在基类中声明Overridable
,例如CreationTime
。但是由于抽象类无论如何都不包含对象,我应该只是能够重载这个属性,还是我误解了?我做了这个,也用于readonly 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#)
在返回属性CFileInfo
和FullName
时,在CreationTime
中设置两个停靠点,输入FullName
并返回正确值,而CreationTime为甚至没有输入。
导致此行为的原因是什么?如何访问CFileInfo
班级的所有成员?
答案 0 :(得分:2)
在这两种情况下重载都是错误的,即FullName
和CreationTime
。 FullName
可以覆盖,因此应该声明Overrides
。你没有必要覆盖它,但你可以这样做。对于CreationTime
,应将其声明为Shadows
。 Shadows
的行为与Overrides
非常相似,只是如果您将类的实例强制转换为基类型,那么您将获得基本实现。如果覆盖成员,即使将其转换为基类型,也可以获得派生的实现。