需要帮助了解此继承层次结构

时间:2019-02-08 12:04:07

标签: c# oop inheritance

我正在寻找一个复杂而通用的遗留框架,我最终将需要对其进行扩展,但是首先只是要简单地理解它,由于继承层次结构和结构,我正为此而努力。

这一切都是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 :(得分:1)

要回答第一个(和第二个)问题,可以扩展单个基类,然后实现多个接口,但是发布的代码仅扩展单个基类。碰巧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;
    }
}

答案 1 :(得分:0)

  

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#基本知识。

我怀疑您缺少有关泛型的知识-您似乎认为泛型和泛型类型参数与继承有关。