У меня проблема с указанием реализации нескольких возможных классов для моего родительского абстрактного класса, использующего универсальные типы.пока это хорошо работает:
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
{
}