在这种情况下如何摆脱垂头丧气?

时间:2020-01-10 03:49:18

标签: c# generics inheritance

我已经为此打破了头脑。情况就是这样。我有两种具有相似属性的文档。一个地方需要高级(基本)属性(名称,日期),创建特定文档以发送到另一个系统需要“行”。现在如何实施:

数据类:

    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
        }
    }

我知道垂头丧气不好。但是我不知道如何更改它。 我可以使用通用参数创建基类,但随后我将失去使用基级属性的能力。这将需要重写返回List的类。 解决方法是什么?并且需要解决吗?

1 个答案:

答案 0 :(得分:0)

您可能想使用界面。

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;
        }
    }
}