J'ai une famille de classes dont je pense qu'elle a besoin d'encapsulation sur les méthodes de création. Prenons, par exemple:Besoin d'aide avec la création d'une classe d'usine pour encapsuler la création d'objets
public abstract class File
{
protected File(string fileName)
{
Name = fileName;
}
string Name {get; set;}
}
public class ImageFile : File
{
protected ImageFile(string fileName, int width, int Height) :base(fileName)
{
Height = height;
Width = width;
}
int Height {get; set;}
int Width {get; set;}
}
public class WordFile : File
{
protected WordFile(string fileName, int wordCount) :base(fileName)
{
WordCount = wordCount;
}
int WordCount {get; set;}
}
Compte tenu de cette hiérarchie de classes, ce qui est la meilleure méthode pour moi de résumer la méthode de création de chaque classes distinctes? Il serait utile si vous pouvez fournir des exemples d'utilisation d'une classe d'usine?
Merci beaucoup
Modifier
Une idée que j'avais l'esprit i est une méthode d'usine dans la classe abstraite qui retourne la classe concrète. par exemple
public abstract class File
{
protected File(string fileName)
{
....
}
string Name {get; set;}
public static File Create(string fileName)
{
if(filename.Contains("jpg")
{
return new ImageFile(...);
}
....
}
}
Mais dans cet exemple je ne suis pas sûr de savoir comment je peux passer les paramètres unqiue pour chacun des types de béton. à-dire largeur, hauteur, WordCount ...
Les usines ont un coût, vous ne devriez donc les utiliser que si elles vont ajouter de la valeur. Quel problème attendez-vous qu'ils résolvent dans votre exemple? Quel type de construction de code voulez-vous autoriser? 'File.Create (...)', retourne une de tes sous-classes? Si oui, comment cela va-t-il être mis en œuvre? Comment l'usine saura-t-elle quelle classe instancier? –
Edité ma question pour élaborer un peu. L'idée est de passer le nomFichier et l'usine va "comprendre" ce que le type concret est basé sur l'extension du fichier. Mais je suis coincé sur la façon de traiter les paramètres de type concret. – Fixer
Ceci est probablement hors sujet, mais vous devriez probablement utiliser 'Path.GetExtension (fileName) .toUpperInvariant() ==" .JPG "' au lieu de simplement utiliser 'fileName.Contains'. Cela permettra des cas mixtes comme "file.JpG", ou une utilisation non-extension comme "listofjpgfiles.txt". – MiffTheFox