указать несколько универсальных реализаций для родительского класса - PullRequest
0 голосов
/ 08 июля 2019

У меня проблема с указанием реализации нескольких возможных классов для моего родительского абстрактного класса, использующего универсальные типы.пока это хорошо работает:

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

хитрость заключается в реализации Class2 из IMLModel_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 и т. д.обычно я просто использовал бы интерфейсы в качестве входных параметров вместо обобщенных, но из-за внедрения зависимостей целевой структуры я должен точно определить входные / выходные параметры (типы запросов), поэтому я получил обобщенные значения.

другой взгляд на эту проблему: как расширить родительский класс несколькими родовыми объектами так же, как это возможно с интерфейсами ?то есть: общедоступный интерфейс IMLModel_Class2: IMLModel,

public interface IMLModel_Class2<RS> : IMLModel<MLModelRequest21, RS>, IMLModel<MLModelRequest22, RS>, IMLModel<MLModelRequest23, RS>
where RS: MLModelResponse2
{
}

против

public  class Class2<RS> : AMLModel<MLModelRequest21, RS>, AMLModel<MLModelRequest22, RS>, AMLModel<MLModelRequest23, RS> // <----- **cannot have multiple parent classes**
    where RS: MLModelResponse2
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...