【问题标题】:Inheriting from the abstract class FileSystemInfo produces not values for all FileInfo members, only for some从抽象类 FileSystemInfo 继承不会为所有 FileInfo 成员产生值,仅对某些成员产生值
【发布时间】:2018-09-28 09:44:58
【问题描述】:

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

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

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

在返回属性 FullNameCreationTime 时在 CFileInfo 中设置两个 Stop 会显示,输入 FullName 并因此返回正确的值,而 CreationTime 甚至没有输入 .

是什么导致了这种行为?如何访问我的CFileInfo 类的所有成员?

【问题讨论】:

  • 当您的类本质上委托给 FileInfo 时,从 FileSystemInfo 继承有什么意义?只需使用 FileInfo 及其流。如果你想用额外的方法来扩展它,添加一个方法扩展
  • 顺便说一句,FileInfo 是一个文件信息,而不是流的包装器。流应该无故保留。在这种情况下,您正在创建一个文件并长时间保持打开和锁定状态。你想用这段代码做什么?为什么不直接使用例如 FileInfo.Create 或 Open 创建流本身?您是否正在尝试创建日志?还是锁定文件?

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


【解决方案1】:

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

【讨论】:

  • Shadows 应尽可能避免。最好使用不同的名称,以便用户清楚地看到有 2 个属性。
  • @HenkHolterman 最好只使用 FileInfo。该问题的代码没有在 FileInfo 之上添加任何内容,但它确实引入了一个错误,因为它使流在另一个类中保持打开状态。
  • 是的,这是对可能是 XY 问题的技术正确答案。
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2016-05-08
  • 2021-11-18
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多