我遇到了一个问题,即利用泛型为我的父抽象类指定多个可能的类实现。到目前为止,效果很好:
public interface IMLModel<RQ, RS> where RQ: IMLModelRequest where RS: IMLModelResponse
{
RS GetModel(RQ request);
}
public interface IMLModel_Class1<RQ, RS> : IMLModel<RQ, RS> where RQ: MLModelRequest1 where RS: MLModelResponse1
{
}
public interface IMLModel_Class2<RS> : IMLModel<MLModelRequest21, RS>, IMLModel<MLModelRequest22, RS>, IMLModel<MLModelRequest23, RS>
where RS: MLModelResponse2
{
}
public abstract class AMLModel<RQ, RS> : IMLModel<RQ, RS> where RQ : IMLModelRequest where RS : IMLModelResponse
{
abstract public RS GetModel(RQ request);
}
public class Class1<RQ, RS> : AMLModel<RQ, RS>, IMLModel_Class1<RQ, RS> where RQ : MLModelRequest1 where RS : MLModelResponse1
{
public override RS GetModel(RQ Request) {
//overrides the parent abstract method
//return RS;
}
}
诀窍在于实现 IMLModel_Class2 中的 Class2 。我想实现基于输入请求参数的特定实现,例如:
public RS GetModel(MLModelRequest21 request) // +override
{
//implementation 1
}
public RS GetModel(MLModelRequest22 request) // +override
{
//new implementation 2
}
public RS GetModel(MLModelRequest23 request) // +override
{
//another implementation 3
}
但是我得到的是这不起作用的代码:
public class Class2<RQ, RS> : AMLModel<RQ, RS>, IMLModel_Class2<RS>
where RS: MLModelResponse2
where RQ: MLModelRequest21, MLModelRequest22, MLModelRequest23 // <--- cannot do that
{
public override RS GetModel(RQ request) {
//struggling here
}
}
部分可以编译:
public class Class2<RS> : AMLModel<MLModelRequest21, RS>,
IMLModel_Class2<RS>
where RS: MLModelResponse2
{
override public RS GetModel(MLModelRequest21 request)
{
//overrides parent
}
public RS GetModel(MLModelRequest22 request)
{
//new implementation 2
}
public RS GetModel(MLModelRequest23 request)
{
//another implementation 3
}
}
但这并不是我想要的,特别是随着其他更复杂的实现(例如Class4,Class5等)的到来。通常,我只将Interfaces用作输入参数,而不是泛型,但是由于目标框架的依赖注入,我必须准确定义输入/输出参数(请求类型),因此我最终使用了泛型。
关于此问题的另一种观点是,如何以与接口相同的方式扩展具有多个泛型的父类?即: 公共接口IMLModel_Class2:IMLModel,
public interface IMLModel_Class2<RS> : IMLModel<MLModelRequest21, RS>, IMLModel<MLModelRequest22, RS>, IMLModel<MLModelRequest23, RS>
where RS: MLModelResponse2
{
}
vs
public class Class2<RS> : AMLModel<MLModelRequest21, RS>, AMLModel<MLModelRequest22, RS>, AMLModel<MLModelRequest23, RS> // <----- **cannot have multiple parent classes**
where RS: MLModelResponse2
{
}