Лучший способ создать базовый тип с сотнями дочерних типов с различными значениями свойств - PullRequest
0 голосов
/ 03 марта 2019

У меня есть такой сценарий:

Существует один базовый тип, скажем, документ.Тогда есть почти 100 типов документов с различными свойствами.

например:

BaseDoc:
    PropA = null
    PropB =defXyz
    PropC = defCCC

Doc A: BaseDoc
    PropA = true
    PropB =Xyz
    PropC = CCC

Doc B:BaseDoc
    PropA = false
    PropB =Xyz1
    PropC = CCC1

Прямо сейчас это то, что я делал для каждого документа, создайте новый класс и затем добавьте его свойства.Но теперь у меня есть сотни документов, и выглядит очень плохо, создавая 100 классов для каждого документа.

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

Я использую c #, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Если вам не нужен строго типизированный доступ к свойствам, я бы использовал словарь пар ключ-значение для строк или объектов, если вам нужна большая гибкость.Вы можете сделать их виртуальными, чтобы унаследованные классы могли переопределять всех членов или, при желании, добавлять / удалять из Словаря.Если вы хотите строго типизированный доступ, вы можете использовать класс PropN в качестве ключа.Если у вас действительно 90 различных типов документов, вы можете добавить словарь в качестве аргумента конструктора.Но если действительно много разных типов документов, они будут по-разному вести себя, и, вероятно, предпочтительным подходом будет наследование и переопределение некоторых значений по умолчанию базового документа.

public class BaseDoc
{

    protected virtual Dictionary<string, string> Props { get; } = new Dictionary<string, string>()
    {
        { "PropA", null },
        { "PropB", "defXyz" },
        { "PropC", "defCCC" }
    };

    protected virtual Dictionary<PropN, string> Props2 { get; } = new Dictionary<PropN, string>()
    {
        { PropN.PropA, null },
        { PropN.PropB, "defXyz" },
        { PropN.PropC, "defCCC" }
    };

    public IReadOnlyDictionary<string, string> PropsReadOnly => Props;

    public IReadOnlyDictionary<PropN, string> Props2ReadOnly => Props2;

}
public class PropN
{
    private PropN(string name) => Name = name;

    public string Name { get; }

    public static readonly PropN PropA = new PropN("PropA");
    public static readonly PropN PropB = new PropN("PropB");
    public static readonly PropN PropC = new PropN("PropC");
}
0 голосов
/ 04 марта 2019

Исходя из комментариев к вопросу, если типы документов отличаются только значениями свойств и правил проверки, у меня будет один класс для всех документов.
Что касается проверки, я бы предложил создатьинтерфейс валидатора с одним методом, который принимает документ и возвращает bool - и разные классы реализуют этот интерфейс для разных типов документов:

public interface IDocumentValidator
{
    bool IsValid(Document document);
}


public class DocAValidator : IValidator
{
    public bool IsValid(Document document)
    {
        // specific implementation for doc A
    }
}

public class DocBValidator : IValidator
{
    public bool IsValid(Document document)
    {
        // specific implementation for doc B
    }
}

Конечно, если у вас есть части проверки, которыеобщие для разных типов документов, вы можете создать базовый класс для хранения этих частей и избежать повторения кода:

public class CommonDocumentValidator : IValidator
{
    public virtual bool IsValid(Document document)
    {
        // common validation rules here
    }
}

, а затем наследовать этот класс следующим образом:

public class DocAValidator : CommonDocumentValidator
{
    public override bool IsValid(Document document)
    {
        if(!base.IsValid(document)) return false;

        // specific implementation for doc A
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...