当我想继承和添加属性时如何处理密封类

Ben*_*ack 39 .net c#

最近关于Stack Overflow的问题中,我问我如何通过文件名解析文件的额外元信息.

在我解决了这个问题之后,我决定创建一种新类型的对象来保存元数据和原始文件.我想我可能会这样做:

class BackupFileInfo : FileInfo, IEquatable<BackupFileInfo>
{
    //Properties and Methods here
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,我会FileInfo在实现的对象的属性中添加元信息时保留原始对象FileInfo,例如IsMainBackup.

但是,FileInfo是密封的,这意味着其他类不能继承它.

相反,我最终得到了以下内容:

class BackupFileInfo : IEquatable<BackupFileInfo>
{
    public bool IsMainBackup { get; set; }
    public int ImageNumber { get; set; }
    public int IncrementNumber { get; set; }
    public FileInfo FileInfo { get; set; }

    //public BackupFileInfo() //constructor here

    public bool Equals(BackupFileInfo other)
    {
        return (this.FileInfo.Name == other.FileInfo.Name
             && this.FileInfo.Length == other.FileInfo.Length);
    }

}
Run Code Online (Sandbox Code Playgroud)

我对这个解决方案并不十分兴奋,因为BackupFileInfo.Length我不得不使用它,而不是能够使用BackupFileInfo.FileInfo.Length.也许这已经是最佳实践,但有些事情感觉不对.

有没有更好的方法来处理这个问题?

Jas*_*yon 29

这是一个经典的组合而不是继承的例子,你走的是正确的方向.

要解决属性问题,只需创建一个名为Length委托给封装FileInfo对象的属性.

  • 这也被称为"最少知识原则" (3认同)
  • 正是我要写的东西. (2认同)

Sea*_*lin 11

您可以在您关心的FileInfo上公开属性.像这样的东西:

public long Length { get { return FileInfo.Length; } }
Run Code Online (Sandbox Code Playgroud)

如果要将大量属性委托给FileInfo,这显然变得不太实用.

  • 不是重点,但纠正了.谢谢. (23认同)
  • `Length`是`long`,而不是`int` (3认同)

Ian*_*ton 10

您可以在类中添加隐式运算符.

例如:

class BackupFileInfo .... {
  /* your exiting code */

  public static implicit operator FileInfo( BackupFileInfo self ){
     return self.FileInfo;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像处理FileInfo对象一样处理BackupFileInfo对象

BackupFileInfo bf = new BackupFileInfo();
...
int mylen = ((FileInfo)bf).Length;
Run Code Online (Sandbox Code Playgroud)

  • 没有解决问题,但+1,因为它真的很有趣! (2认同)

Mar*_*ell 6

穿越?

class BackupFileInfo : IEquatable<BackupFileInfo>
{
    public long Length {get {return FileInfo.Length;}}
    //.... [snip]
}
Run Code Online (Sandbox Code Playgroud)

另外,一个名为 的 propFileInfo正在自找麻烦……它可能需要FileInfo在一些地方对类进行消歧。

  • 实际上,建议为属性提供与其类型相同的名称(当有意义时),而不是添加此类前缀,并且在 BCL 中足够常见(例如 SolidBrush.Color)。请参阅 http://msdn.microsoft.com/en-us/library/fzcth91k.aspx 上的命名指南。 (3认同)