我正在寻找一个复杂而通用的遗留框架,我最终将需要对其进行扩展,但是首先只是要简单地理解它,由于继承层次结构和结构,我正为此而努力。
这一切都是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#基本知识。
答案 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#基本知识。
我怀疑您缺少有关泛型的知识-您似乎认为泛型和泛型类型参数与继承有关。