Базовый класс разрешен в шаблоне стратегии - PullRequest
0 голосов
/ 21 апреля 2020

Я создал решение для чтения / обработки различных типов файлов, например, XML, JSON, txt.

public interface IFileProcessor
{
     TOutput Process<TInput, TOutput>(TInput input);
}

public abstract class FileProcessorBase
    {
        protected readonly FileInfo fileInfo;
        protected FileProcessorBase(FileInfo fileInfo)
        {
            this.fileInfo = fileInfo;
        }

        protected abstract TOutput Load<TOutput>();
    }

И конкретный класс следующим образом.

public class JsonFileProcessor : FileProcessorBase, IFileProcessor
    {
        public JsonFileProcessor(FileInfo fileInfo) : base(fileInfo) 
        {

        }
        public TOutput Process<TInput, TOutput>(TInput from)
        {
              //Call Load Method
              string res = Load<string>();
              return (TOutput)Convert.ChangeType(res, typeof(TOutput), CultureInfo.InvariantCulture);
        }

        protected override TOutput Load<TOutput>()
        {
              string res = "JSON Load method";
              return (TOutput)Convert.ChangeType(res, typeof(TOutput), CultureInfo.InvariantCulture);
        }
  }

Конкретный класс для XML

public class XMLFileProcessor : FileProcessorBase, IFileProcessor
    {
        public XMLFileProcessor(FileInfo fileInfo) : base(fileInfo)
        {

        }

        public TOutput Process<TInput, TOutput>(TInput from)
        {
            string res = Load<string>();
            return (TOutput)Convert.ChangeType(res, typeof(TOutput));
        }

        protected override TOutput Load<TOutput>()
        {
            string xml = "XML";
            return (TOutput)Convert.ChangeType(xml, typeof(TOutput));
        }
  }

и теперь это фабричный класс

public class FileProcessorFactory
    {
        static readonly Dictionary<string, IFileProcessor> fileProcessor;
        static FileProcessorFactory()
        {
            fileProcessor = new Dictionary<string, IFileProcessor>();
            fileProcessor.Add("XML", new XMLFileProcessor(new FileInfo(""));
            fileProcessor.Add("JSON", new JsonFileProcessor(new FileInfo(""));
        }

        public static IFileProcessor GetFileProcessor(string key)
        {
            return fileProcessor[key];
        }
    }

Ниже приведен класс FileProcessorService

public class FileProcessorService
    {
        IFileProcessor fileProcessor;

        public FileProcessorService(IFileProcessor fileProcessor)
        {
            this.fileProcessor = fileProcessor;
        }

        public TOutput Process<TInput, TOutput>(TInput from)
        {
            return fileProcessor.Process<TInput, TOutput>(from);
        }
    }

Теперь, наконец, я звоню по этому пути.

IFileProcessor fileProcessor = FileProcessorFactory.GetFileProcessor("XML");
FileProcessorService fileProcessorService = new FileProcessorService(fileProcessor);
var XMLResult = fileProcessorService.Process<string, string>("");

Могу ли я использовать базовый класс в шаблоне стратегии, если нет то, что было бы предложено решением.

1 Ответ

1 голос
/ 21 апреля 2020

Это может помочь ответить на ваш конкретный c вопрос относительно того, являются ли их жесткие правила, чтобы сказать, что шаблон стратегии не должен наследовать какую-либо базовую реализацию.

Могу ли я использовать наследование вместо реализации интерфейс в шаблоне стратегии?

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

...