Общий шаблон фабрики C # без указания типа универсального - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над проектом C # для разбора файлов разных типов.Для этого я создал следующую структуру классов:

interface FileType {}
    class FileType1 : FileType {}
    class FileType2 : FileType {}

abstract class FileProcessor<T> {}
    class Processor_FileType1 : FileProcessor<FileType1> {} 
    class Processor_FileType2 : FileProcessor<FileType2> {} 

Теперь я хотел бы создать фабричный шаблон, который просто берет путь к файлу и на основесодержимое файла решает, какой из 2 процессоров создать экземпляр .

В идеале (и я знаю, что этот код не работает), я бы хотел, чтобы мой код выглядел следующим образом:

class ProcessorFactory
{
    public FileProcessor Create(string pathToFile)
    {
        using (var sr = pathToFile.OpenText())
        {
            var firstLine = sr.ReadLine().ToUpper();

            if (firstLine.Contains("FIELD_A"))
                return new Processor_FileType1();

            if (firstLine.Contains("FIELD_Y"))
                return new Processor_FileType2();
        }
    }
}

Проблема заключается в ошибке компилятора Using the generic type 'FileProcessor<T>' requires 1 type arguments, поэтому моя программа могла сделать что-то вроде:

public DoWork()
{
    string pathToFile = "C:/path to my file.txt";
    var processor = ProcessorFactory.Create(pathToFile);
}

и переменная processor может иметь значение Processor_FileType1 или Processor_FileType2.

Я знаю, что мог бы сделать это, изменив Create на аргумент типа, но я надеюсь, что мне не придется с тех пор, чтобы это убило идею выяснить это на основе данных вфайл.

Есть идеи?

1 Ответ

0 голосов
/ 09 мая 2018

Ты очень близко. Вам просто нужна еще одна концепция в вашей объектной модели, общий IFileProcessor.

interface FileType {}
    class FileType1 : FileType {}
    class FileType2 : FileType {}

interface IFileProcessor {}  //new
abstract class FileProcessor<T> : IFileProcessor {}
    class Processor_FileType1 : FileProcessor<FileType1> {} 
    class Processor_FileType2 : FileProcessor<FileType2> {} 

И измените свой тип возврата:

public IFileProcessor Create(string pathToFile)
{
    //implementation
}
...