2010-01-07 7 views
31

In einer recent question on Stack Overflow fragte ich, wie ich durch einen Dateinamen zu zusätzlichen Meta-Informationen über eine Datei analysieren könnte.Wie man mit einer versiegelten Klasse umgeht, wenn ich Eigenschaften erben und hinzufügen wollte

Nachdem ich dieses Problem durchgearbeitet habe, habe ich entschieden, dass ich vielleicht einen neuen Objekttyp erstellen möchte, der die Metadaten und die Originaldatei enthält. Ich dachte, ich könnte etwas tun:

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

Die Idee wäre, dass ich das ursprüngliche FileInfo Objekt behalten würde, während Meta-Informationen in den Eigenschaften des Objekts hinzufügen, die FileInfo, wie IsMainBackup implementiert.

Allerdings ist FileInfo versiegelt, was bedeutet, dass andere Klassen nicht davon erben können.

Stattdessen habe ich mit folgendem endete:

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); 
    } 

} 

Ich bin nicht sehr begeistert über diese Lösung, weil statt BackupFileInfo.Length einsetzen zu können, werde ich BackupFileInfo.FileInfo.Length zu verwenden haben. Vielleicht ist dies bereits die beste Vorgehensweise, aber etwas fühlt sich nicht richtig an.

Gibt es einen besseren Weg, um mit diesem Problem umzugehen?

Antwort

24

Dies ist eine der klassischen Zusammensetzung statt Vererbung Beispiele und Sie gingen in die richtige Richtung.

Um Ihr Eigenschaftsproblem zu lösen, erstellen Sie einfach eine Eigenschaft namens Length, die an das verkapselte Objekt FileInfo delegiert.

+2

Genau das, was ich schreiben wollte. – wheaties

+2

Dies wird auch als "Least Knowledge Principle" –

9

Sie könnten einfach die Eigenschaften auf FileInfo, die Ihnen wichtig sind, verfügbar machen. So etwas wie das:

Dies wird offensichtlich weniger praktisch, wenn Sie viele Eigenschaften an FileInfo delegieren möchten.

+2

'Length' ist' long', nicht 'int' –

+19

nicht wirklich der Punkt, aber korrigiert. Vielen Dank. –

4

Pass-Thru?

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

Auch eine Stütze genannt FileInfo es, ohne Probleme zu fragen ... kann es an einigen Stellen Begriffsklärung gegen die FileInfo Klasse benötigen.

+0

Guter Punkt über die 'FileInfo' Namenskonvention. Ich wollte vermeiden, mich mit Namen wie 'MyFileInfo',' ThisFileInfo', 'SuperFileInfo' zu ärgern. –

+3

Eigentlich wird empfohlen, einer Eigenschaft den gleichen Namen zu geben wie ihrem Typ (wenn es sinnvoll ist), anstatt solche Präfixe hinzuzufügen, die in der BCL (SolidBrush.Color, zum Beispiel) üblich genug sind. Siehe Namensrichtlinien unter http://msdn.microsoft.com/en-us/library/fzcth91k.aspx. – Trillian

2

Sie können die Eigenschaften von Dateiinformationen problemlos in Ihre eigenen Eigenschaften umwandeln, wenn Sie möchten.

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

'Länge' ist' lang', nicht 'int' –

+0

behoben, es war eine Vermutung wirklich! –

2

Diese Ihr größeres Problem nicht wirklich lösen, aber natürlich können Sie nur die Eigenschaften machen Sie fungieren als Stellvertreter an die realen Eigenschaften unter verwenden möchten. Z.B.

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

(Mit approriate null Prüfung natürlich.)

5

Sie könnten einen implicit Operator Ihrer Klasse hinzuzufügen.

ZB:

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

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

Sie könnten dann BackupFileInfo behandeln Objekt wie ein Fileinfo-Objekt wie so

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

Also müsste ich 'BackupFileInfo' als' FileInfo' ablegen, um auf die Eigenschaften und Methoden von 'FileInfo' zugreifen zu können? Wenn das der Fall ist, würde ich lieber 'BackupFileInfo.FileInfo' verwenden. –

+0

löst das Problem nicht, aber +1, weil es wirklich interessant ist! –

+0

Link zu implizit doc scheint tot – Jerther

Verwandte Themen