2010-01-07 50 views
31

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。也许这已经是最好的做法,但有些事情感觉不对。

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

回答

24

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

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

+2

正是我要写的。 – wheaties 2010-01-07 21:34:50

+2

这也被命名为'最少知识原则'' – 2010-01-07 22:29:22

9

您可以在您关心的FileInfo上公开属性。类似这样的:

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

如果你想委托很多属性到FileInfo,这显然变得不太实际。

+2

'Length'是'long',不'int' – 2010-01-07 21:38:29

+19

不是真正的点,但纠正。谢谢。 – 2010-01-07 21:41:05

4

Pass-thru?

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

而且,一个道具叫FileInfo是自找麻烦...这可能需要对FileInfo类歧义的几个地方。

+0

关于'FileInfo'命名约定的好处。我试图避免使用'MyFileInfo','ThisFileInfo','SuperFileInfo'等名称来烦我自己。 – 2010-01-07 21:36:10

+3

实际上,建议通过添加这样的前缀并在BCL(例如SolidBrush.Color)中足够常见,给它一个与它的类型名称相同的名称(当它有意义时)。请参阅http://msdn.microsoft.com/en-us/library/fzcth91k.aspx上的命名指南。 – Trillian 2010-01-07 22:31:22

2

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

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

'长度'是'长',而不是'int' – 2010-01-07 21:37:53

+0

固定,这真是一个猜测! – 2010-01-07 22:05:29

2

这并不能真正解决你的问题比较大,但当然你可以让你想使用充当代理,以下面的不动产的属性。例如。

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

(当然了approriate空检查。)

5

你可以一个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; 
+1

所以我必须将'BackupFileInfo'作为'FileInfo'来施放,以便访问'FileInfo'的属性和方法?如果是这样的话,我想我宁愿使用'BackupFileInfo.FileInfo'。 – 2010-01-07 21:37:53

+0

不解决问题,但+1,因为它真的很有趣! – 2017-06-01 13:58:28

+0

链接到隐式文档看起来已经死了 – Jerther 2018-01-31 20:29:00