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

时间:2010-01-07 21:22:10

标签: c# .net

recent question on Stack Overflow中,我问我如何通过文件名解析文件的额外元信息。

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

class BackupFileInfo : FileInfo, IEquatable<BackupFileInfo>
{
    //Properties and Methods here
}

我的想法是,在实现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);
    }

}

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

有更好的方法来解决这个问题吗?

6 个答案:

答案 0 :(得分:27)

这是经典的作品之一,而不是继承的例子,你走的是正确的方向。

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

答案 1 :(得分:10)

您可以在您关注的FileInfo上公开属性。像这样:

public long Length { get { return FileInfo.Length; } }

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

答案 2 :(得分:8)

您可以在班级中添加implicit运算符。

例如:

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

  public static implicit FileInfo( BackupFileInfo self ){
     return self.FileInfo;
  }
}

然后,您可以将BackupFileInfo对象视为FileInfo对象,如此

BackupFileInfo bf = new BackupFileInfo();
...
int mylen = ((FileInfo)bf).Length;

答案 3 :(得分:4)

直通?

class BackupFileInfo : IEquatable<BackupFileInfo>
{
    public long Length {get {return FileInfo.Length;}}
    //.... [snip]
}

此外,一个名为FileInfo的道具正在寻找麻烦......在一些地方可能需要消除对FileInfo班级的歧义。

答案 4 :(得分:2)

如果您愿意,可以轻松地将文件信息属性包装在您自己的属性中。

public long Length
{
    get
    {
       return this.FileInfo.Length;
    }
}

答案 5 :(得分:2)

这并没有真正解决你的大问题,但当然你可以让你想要使用的属性充当下面真实属性的代理。 E.g。

public long Length
{
    get {return FileInfo.Length;}
}

(当然有适当的空检查。)