在c#中实现通用接口

时间:2014-04-19 11:45:41

标签: c# generics

我们如何将泛型接口继承到泛型类? 我尝试了下面的代码并收到错误消息:“Bc'没有实现接口成员'ConsoleApplication3.iB.showval(int,int)”。如何解决?

interface iB<X, Y> 
{
    void storeval(X p1,Y p2);
    void getval();
}
class Bc<X,Y>:iB<int,int>
{
    private X _dm1;
    private Y _dm2;
    public void storeval(X p1,Y p2) 
    {
        this._dm1 = p1;
        this._dm2 = p2;
    }
    public void getval() 
    {
        Console.WriteLine("{0}\t{1}",this._dm1,this._dm2);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Bc<string, bool> b1 = new Bc<string, bool>();
        b1.storeval("AppScienti",true);
        b1.getval();
        Console.ReadKey();
    }
}

2 个答案:

答案 0 :(得分:3)

您的代码不是继承通用接口 - 它继承了通用接口的完全定义的实例。

由于您继承了iB<int,int>,因此需要实施

public void storeval(int p1, int p2) {
    ...
}

或者,您可以继承iB<X,Y>,在这种情况下,您的接口实现会起作用:

class Bc<X,Y> : iB<X,Y> {
    ...
}

在任何一种情况下,依赖于通用接口的类型参数的接口方法的参数都需要与继承接口时指定的类型参数匹配。

答案 1 :(得分:0)

使用class Bc<X, Y> : iB<int, int>,您可以定义一个新的泛型类,它具有两个新的泛型类型参数,恰好可以实现iB<int, int>。如果您重命名它们会更清楚:class Bc<NewX, NewY> : iB<int, int>

您的两个新泛型类型参数与接口定义的参数无关。现在,您可以在类仍然实现new Bc<string, bool>时声明iB<int, int>变量。

您必须更改方法签名才能实现iB<int, int>.storeval(int, int)

public void storeval(int p1, int p2) 

如果您更改Bc类以继承这样的通用参数:

class Bc<X, Y> : iB<X, Y>

你可以像这样实例化一个:

var bcInt = new Bc<int, int>();