C# куда вынести однородные данные из класса
Пишу программу, которая работает с файлами книг (на данный момент epub,fb2,fb3). Есть класс Book с конкретной информацией о каждой книге. Есть статический класс который собственно и обрабатывает все эти книги и результат заносит в List для дальнейшей работы.
Для обработки файлов используется по сути один и тот же код, только данные отличаются в зависимости от формата файла. например в epub надо открыть файл по патчу "content.opf", у fb3 по патчу "fb3/description.xml", а у fb2 вообще отсутствует (допустимо записать пустой "" патч). И таких различных параметров на данный момент 8.
Вопрос, где можно хранить эту информацию, которая относится не к конкретной книге, а к формату книги. Можно ли сделать статический класс с этой информацией, чтобы не создавать экземпляр класса? Ведь он просто хранит информацию, никаких действий с ней делать не надо. Хочется понять, как это сделать корректнее и правильнее.
Ответы (2 шт):
Можно реализовать через абстрактный класс, в котором будет общая логика, и при необходимости вы сможете в классе наследнике переопределить то, что вам нужно, в зависимости от условий. Например, код может выглядеть так:
Для начала создаем общий интерфейс для всех книг
public interface IBook
{
string Title { get; set; }
}
После создаем модели для двух типов книг
public class Book1 : IBook
{
public string Title { get; set; }
}
public class Book2 : IBook
{
public string Title { get; set; }
}
Далее создаем абстрактный класс, в котором будет общая логика
public abstract class BookExample<T>
where T : class, IBook
{
// Указываем нашу переменную, которую необходимо реализовать
public abstract string FilePath { get; set; }
// Реализуем все методы, например метод чтения
protected virtual void Read()
{
var text = File.ReadAllText(FilePath);
}
}
И наконец, создаем классы, для наших двух типов книг
public class TestBook1 : BookExample<Book1>
{
public override string FilePath { get; set; } = "filePath1";
}
public class TestBook2 : BookExample<Book2>
{
public override string FilePath { get; set; } = "filePath2";
protected override void Read()
{
// переопределяем класс, если такое необходимо
base.Read();
}
}
Вариант 1 то что вы хотели статичный класс
public static class GlobalConfig
{
public static string path1 { get { return @"c:\content.opf"; } }
public static string path2 { get { return @"d:\"; } }
}
Вариант 2 switch
public string GetmyPath()
{
string filePath;
using (OpenFileDialog opf = new OpenFileDialog())
{
if (opf.ShowDialog() == DialogResult.OK)
{
filePath = opf.FileName;
string extention = Path.GetExtension(filePath); // получаем расширение файла .exe , .txt
switch (extention)
{
case ".txt":
{
Process.Start("notepad.exe", filePath); // октрываем тектовые документы через notpad
return filePath;
}
case ".opf": // что делать если файл с .opf
{
return GlobalConfig.path1
}
case ".xml": // что делать если файл с .xml
{
// десериализация ?
break;
}
default:
{
return string.Empty;
}
break;
}
}
}
return String.Empty;
}