为父类指定多个通用实现

时间:2019-07-08 12:45:20

标签: c# generics architecture

我遇到了一个问题,即利用泛型为我的父抽象类指定多个可能的类实现。到目前为止,效果很好:

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
{
}

0 个答案:

没有答案