C#generic接口实现到派生类

时间:2017-09-26 11:05:39

标签: c# inheritance generic-collections

我陷入了泛型类和接口的实现。我不确定我想做什么是可能的。

这是我的代码: - 我已经定义了一个类型没有像

那样定义的泛型类
public class Response<T>
{

    public T Data { get; set; }

    public Response()
    {
        Data = default(T);
    }
}

和一个现在有一个功能的接口

public interface  IOInterface<T> where T : Response<T>
{
    Response<T> ReadAdvantechChannel(Dictionary<string, string> IOParameters);
}

一个派生类将实现此接口: -

public class AdvantechOperation : IOInterface<T> 
{
    public Response<AIRecordInfo> ReadAdvantechChannel(Dictionary<string, string> IOParameters)
    {
        Response<AIRecordInfo> resp = new Response<AIRecordInfo>();
    }
}

和AIrecordinfo再次上课

public class AIRecordInfo
{
    double[] ArryMaxValueAIdouble;
    double[] ArryMinValueAIdouble;
    double[] ArryAVGValueAIdouble;
}

我想要做的是实现一个实现define接口的类,但返回类型的接口函数对于我未来的派生类是不明确的,这就是为什么我把它变成通用的并尝试实现它我现在的类&#34; AdvantechOperation& #34 ;.我的界面将有三个函数,所有函数返回类型将彼此不同,这就是为什么我使它成为泛型返回类型响应和我现在的类AdvantechOperation,T替换为AIRecordInfo。 但是在编译这个项目时我面临的错误是

  

错误7类型&#39; T&#39;不能用作类型参数&#39; T&#39;在里面   通用类型或方法&#39; IOModule.IOInterface&#39;。没有拳击   转换或类型参数转换来自&#39; T&#39;至   &#39; IOModule.Response&#39 ;. D:\ MTS \ SMS \ DAQAdvantechdll \ DAQAdvantechdll \ IOCommunication.cs 28 18 IOModule   错误8&#39; IOModule.AdvantechOperation&#39;没有实现接口   会员   &#39; IOModule.IOInterface.ReadAdvantechChannel(System.Collections.Generic.Dictionary)&#39 ;.   &#39; IOModule.AdvantechOperation.ReadAdvantechChannel(System.Collections.Generic.Dictionary)&#39;   无法实施   &#39; IOModule.IOInterface.ReadAdvantechChannel(System.Collections.Generic.Dictionary)&#39;   因为它没有匹配的返回类型   &#39; IOModule.Response&#39 ;. D:\ MTS \ SMS \ DAQAdvantechdll \ DAQAdvantechdll \ IOCommunication.cs 28 18 IOModule

2 个答案:

答案 0 :(得分:1)

删除接口的泛型类型约束,并在实现接口时使用AIRecordInfo作为泛型类型参数:

public class AdvantechOperation : IOInterface<AIRecordInfo>
{ ... } 

答案 1 :(得分:1)

在我看来,你想要这个:

public class Response<T> { }

public interface IOInterface<T> where T : Response<T>
{
    T ReadAdvantechChannel(Dictionary<string, string> IOParameters);
}

public class AdvantechOperation : IOInterface<AIRecordInfo>
{
    public AIRecordInfo ReadAdvantechChannel(Dictionary<string, string> IOParameters)
    {
        return new AIRecordInfo();
    }
}

public class AIRecordInfo : Response<AIRecordInfo>
{
    double[] ArryMaxValueAIdouble;
    double[] ArryMinValueAIdouble;
    double[] ArryAVGValueAIdouble;
}

Response<T>不再需要正文,因为IOInterface<T>的方法只返回必须从T继承的Response<T>