在c中实现通用接口

本文关键字:接口 实现 | 更新日期: 2023-09-27 17:58:57

我们如何将泛型接口继承到泛型类中?我尝试了以下代码,但收到错误消息:"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();
    }
}

在c中实现通用接口

您的代码没有继承泛型接口,而是继承了泛型接口的完全定义实例。

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

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

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

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

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

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

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

您必须更改方法签名,使其实现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>();