Нужна помощь в понимании этой иерархии наследования - PullRequest
0 голосов
/ 08 февраля 2019

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

Все это является частью внутренней работы стека служб WCF, обработки запросов, ответов и т. Д.

В качестве примера я включил только сигнатуры классов и их конструкторы, поскольку внутренняя функциональностьне беспокойтесь.

public sealed class ProcessDerived : ProcessBase<Filter, RequestExternal, RequestItemExternal, ResponseCallBack, ResponseInternal>
{
    public ProcessDerived(ProcessManager Manager) : base(Manager) { }
}

public abstract class ProcessBase<TFilter, TRequestExternal, TRequestItemExternal, TResponseCallBack, TResponseInternal>
    : ProcessBaseSync<TFilter, TRequestExternal, TRequestItemExternal, TResponseCallBack, TResponseInternal>
    where TFilter : FilterBase
    where TRequestExternal : class
    where TRequestItemExternal : class
    where TResponseCallBack : class
    where TResponseInternal : ProcessResponseBase
{
    protected ProcessBase(ProcessManager Manager) : base(Manager) { }
}

public abstract class ProcessBaseSync<TFilter, TRequestExternal, TRequestItemExternal, TResponseCallBack, TResponseInternal>
    : ProcessBaseCache<TFilter, TRequestExternal, TRequestItemExternal, object, TResponseCallBack, TResponseInternal, CacheKeyBase>
    where TFilter : FilterBase
    where TRequestExternal : class
    where TRequestItemExternal : class
    where TResponseCallBack : class
    where TResponseInternal : ProcessResponseBase
{
    protected ProcessBaseSync(ProcessManager Manager) : base(Manager) { }
}

public abstract class ProcessBaseCache<TFilter, TRequestExternal, TRequestItemExternal, TResponseImmediate, TResponseCallBack, TResponseInternal, TCacheKey>
    : IProcess, IProcess<TFilter, TResponseInternal>, IProcess<TResponseCallBack>
    where TFilter : FilterBase
    where TRequestExternal : class
    where TRequestItemExternal : class
    where TResponseImmediate : class
    where TResponseCallBack : class
    where TResponseInternal : ProcessResponseBase
    where TCacheKey : CacheKeyBase
{
    private ProcessManager _manager;

    protected ProcessBaseCache(ProcessManager Manager)
    {
        _manager = Manager;
    }
}

Основные вопросы, которые у меня есть:

1) Какой технический термин используется для описания этой структуры множественного наследования, как показано в первой строке: "ProcessDerived: ProcessBase".

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

2) Наследует ли оно от "ProcessBase", а также от всех параметров типа рядом с ним?

3) Что такоецель добавления ": base (XYZ)" в конструктор?Это просто требование соответствия наследования классов (конструктор, имитирующий сигнатуру класса)?Я не понимаю, почему это требуется.

Эта сложная 4-уровневая иерархия кажется очень ненужной и кажется невозможной для следования.

Я явно упускаю некоторые фундаментальные знания C # здесь.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Чтобы ответить на ваш первый (и второй) вопрос, вы можете расширить один базовый класс, а затем реализовать несколько интерфейсов, но размещенный вами код расширяет только один базовый класс.Просто так получается, что ProcessBase принимает 5 разных типов, но это все еще один класс.


Что касается вашего третьего вопроса, они добавили base, потому что класс расширяет базуКласс, у которого нет конструктора без параметров.

Вот более простой пример, демонстрирующий ту же концепцию.Класс Person имеет один ctor, ожидающий имя, поэтому любой класс, который его расширяет, должен предоставить этот параметр посредством вызова base().

public class Person
{
    public string Name { get; set; }

    public Person(string name)
    {
        Name = name;
    }
}

public class Employee : Person
{
    public DateTime HireDate { get; set; }

    public Employee(string name, DateTime hireDate) : base(name)
    {
        HireDate = hireDate;
    }
}
0 голосов
/ 08 февраля 2019

1) Какой технический термин используется для описания этой структуры множественного наследования, как показано в первой строке: "ProcessDerived: ProcessBase.

Это одиночное наследование. ProcessDerived наследуется от ProcessBase<Filter, RequestExternal, RequestItemExternal, ResponseCallBack, ResponseInternal>.

2) Наследует ли он от "ProcessBase", а также от всех параметров типа рядом с ним?

ProcessBase<Filter, RequestExternal, RequestItemExternal, ResponseCallBack, ResponseInternal> является(закрытый универсальный) тип. ProcessDerived наследуется от него.

ProcessBase<TFilter, TRequestExternal, TRequestItemExternal, TResponseCallBack, TResponseInternal> - соответствующий открытый универсальный тип - параметры типа TFilter и т. д. еще не определены.

3) Какова цель добавления «: base (XYZ)» в конструктор? Является ли это просто требованием соответствия наследования классов (конструктор, имитирующий сигнатуру класса)? Я не понимаю, почему это требуется.

Когда создается экземпляр вашего подкласса, ему необходимо вызвать один из конструкторов базового класса. Если базовый класс имеет конструктор без параметров, он вызывается неявно. Если этого не происходит, вам необходимо явно вызватьодин из его конструкторов, передавая все необходимые параметры, используя : base(...).

Я явно упускаю некоторые фундаментальные знания C # здесь.

Я подозреваю, что вы знания "Отсутствует около обобщений - кажется, вы думаете, что универсальные типы и параметры универсальных типов участвуют в наследовании.

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