Как избавиться от ударов в этом случае? - PullRequest
0 голосов
/ 10 января 2020

Я уже сломал голову над этим. Итак, вот ситуация. У меня есть два типа документов с похожими свойствами. Свойства высокого уровня (базового уровня) (Имя, Дата) требуются в одном месте, «Строки» необходимы для создания конкретного c документа для отправки в другую систему. Как это реализовано сейчас:

Классы данных:

    public abstract class BaseDocument
    {
        public string Name { get; set; }
        public DateTime Date { get; set; }
    }

    public abstract class BaseDocument<TRowType> : BaseDocument
    {
        public abstract List<TRowType> Rows { get; set; }
    }

    public class DocumentTypeOne : BaseDocument<RowTypeOne>
    {
        public override List<RowTypeOne> Rows { get; set; }
    }

    public class DocumentTypeTwo : BaseDocument<RowTypeTwo>
    {
        public override List<RowTypeTwo> Rows { get; set; }
    }


    public class RowTypeOne
    {
        public int Cost { get; set; }
    }

    public class RowTypeTwo
    {
        public int Change { get; set; }
    } 

ProcessorClass:

    public class DocumentsProcessor
    {
        public void ProcessDocument(BaseDocument doc)
        {
            switch (doc)
            {
                case DocumentTypeOne t1:
                    ProcessDocumentTypeOne((DocumentTypeOne)doc);
                    break;
                case DocumentTypeTwo t2:
                    ProcessDocumentsTypeTwo((DocumentTypeTwo)doc);
                    break;
                default:
                    throw new ArgumentException($"Unhandled type {nameof(doc)}");
            }
        }

        public void ProcessDocumentTypeOne(DocumentTypeOne docOne)
        {
            // specific actions
        }

        public void ProcessDocumentsTypeTwo(DocumentTypeTwo docTwo)
        {
            // other specific actions
        }
    }

Я знаю, что уныние - это не хорошо. Но я понятия не имею, как это изменить. Я могу создать базовый класс с параметром generi c, но тогда я потеряю способность работать только со свойствами базового уровня. И для этого потребуется переписать класс, возвращающий List. Какой способ решить это? И нужно ли это решать?

1 Ответ

0 голосов
/ 10 января 2020

Возможно, вы захотите использовать интерфейсы.

public interface IBaseDocument
{
    string Name { get; set; }
    DateTime Date { get; set; }
}

public interface IDocumentWithRows<T>
{
    List<T> Rows { get; set; }
}

public class DocumentTypeOne: IBaseDocument, IDocumentWithRows<RowTypeOne>
{
    string IBaseDocument.Name { get; set; }
    DateTime IBaseDocument.Date { get; set; }
    List<RowTypeOne> IDocumentWithRows<RowTypeOne>.Rows { get; set; }
}

public class DocumentProcessor
{
    public void ProcessDocument(IBaseDocument doc)
    {
        switch (doc)
        {
            case DocumentTypeOne docTypeOne:
                ProcessDocumentTypeOne(docTypeOne);
                break;
            case DocumentTypeTwo docTypeTwo:
                ProcessDocumentTypeTwo(docTypeTwo);
                break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...