2010-01-07 9 views
31

En un recent question on Stack Overflow, pregunté cómo podría analizar un nombre de archivo para obtener información adicional sobre un archivo.Cómo lidiar con una clase sellada cuando quería heredar y agregar propiedades

Después de resolver este problema, decidí que podría querer crear un nuevo tipo de objeto para contener los metadatos y el archivo original. Pensé que podría hacer algo como esto:

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

La idea sería que iba a retener el FileInfo objeto original al tiempo que añade la información de metadatos en las propiedades del objeto que implementa FileInfo, como IsMainBackup.

Sin embargo, FileInfo está sellado, lo que significa que otras clases no pueden heredar de él.

En cambio, terminé con lo siguiente:

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

} 

No estoy terriblemente emocionado por esta solución porque en lugar de ser capaz de utilizar BackupFileInfo.Length, voy a tener que usar BackupFileInfo.FileInfo.Length. Tal vez esta es la mejor práctica, pero algo no se siente bien.

¿Hay una forma mejor de solucionar este problema?

Respuesta

24

Esta es una de las composiciones clásicas en lugar de ejemplos de herencia y fue en la dirección correcta.

Para resolver su problema de propiedad simplemente cree una propiedad llamada Length que delegue en el objeto FileInfo encapsulado.

+2

Exactamente lo que estaba a punto de escribir. – wheaties

+2

Esto también se denomina 'Principio de conocimiento mínimo' –

9

Puede exponer las propiedades en FileInfo que le interesan. Algo como esto:

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

Obviamente, esto resulta menos práctico si desea delegar muchas propiedades a FileInfo.

+2

'' Length' es long', no 'int' –

+19

No es realmente el punto, pero corregido. Gracias. –

4

Pass-thru?

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

Además, un puntal llama FileInfo es buscar problemas ... es posible que tenga desambiguación contra la clase FileInfo en unos pocos lugares.

+0

Buen punto acerca de la convención de nombres' FileInfo'. Estaba tratando de evitar molestarme con nombres como 'MyFileInfo',' ThisFileInfo', 'SuperFileInfo'. –

+3

En realidad, se recomienda dar a una propiedad el mismo nombre que su tipo (cuando tiene sentido) sobre la adición de dichos prefijos y lo suficientemente común en el BCL (SolidBrush.Color, por ejemplo). Consulte las Pautas de nombres en http://msdn.microsoft.com/en-us/library/fzcth91k.aspx. – Trillian

2

Puede ajustar fácilmente las propiedades de información de archivos en sus propias propiedades si lo desea.

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

'Longitud' es' largo', no 'int' –

+0

fijo, ¡era una suposición realmente! –

2

Esto en realidad no soluciona el problema más grande, pero por supuesto que sólo puede hacer que las propiedades que desea utilizar actúan como proxies a las propiedades reales por debajo. P.ej.

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

(Con approriate nula comprobación por supuesto.)

5

Se podría añadir un operador implicit a su clase.

Ej:

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

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

A continuación, podría tratar su objeto BackupFileInfo como un objeto FileInfo al igual que

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

, entonces tendría que convertir 'BackupFileInfo' como' FileInfo' para acceder a las propiedades y métodos de 'FileInfo'? Si ese es el caso, creo que prefiero usar 'BackupFileInfo.FileInfo'. –

+0

no resuelve el problema pero +1 ¡porque es realmente interesante! –

+0

el enlace al documento implícito parece estar muerto – Jerther

Cuestiones relacionadas