2010-01-07 22 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