继承自抽象类FileSystemInfo不会为所有FileInfo成员生成值,仅适用于某些成员

时间:2018-04-18 08:29:03

标签: .net vb.net inheritance abstract-class fileinfo

我创建了一个继承自CFileInfo类的类FileSystemInfo。我的构造函数将一个新的FileInfo对象分配给一个类范围的变量。

必须覆盖3个成员(NameExistsDelete)。

但是,其他成员未在基类中声明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#)

在返回属性CFileInfoFullName时,在CreationTime中设置两个停靠点,输入FullName并返回正确值,而CreationTime为甚至没有输入

导致此行为的原因是什么?如何访问CFileInfo班级的所有成员?

1 个答案:

答案 0 :(得分:2)

在这两种情况下重载都是错误的,即FullNameCreationTimeFullName可以覆盖,因此应该声明Overrides。你没有必要覆盖它,但你可以这样做。对于CreationTime,应将其声明为ShadowsShadows的行为与Overrides非常相似,只是如果您将类的实例强制转换为基类型,那么您将获得基本实现。如果覆盖成员,即使将其转换为基类型,也可以获得派生的实现。