为什么在我的界面实现中没有出现任何错误?

时间:2019-12-10 10:48:41

标签: c#

**查看“编辑”部分**

我有一个界面

IInterface<TYPE_ONE, TYPE_TWO> where TYPE_TWO : string
{
    void foo();
}

然后我有一个BaseClass

class BaseClass<TYPE_ONE, TYPE_TWO> where TYPE_TWO: string

现在我想在BaseClassIInterfase

中实施
class BaseClass<TYPE_ONE, TYPE_TWO> where TYPE_TWO: string, IInterface<TYPE_ONE, TYPE_TWO>{}

问题是-我希望VisualStudio告诉我

  

您必须实现IInterface方法foo()

但是我没有收到任何此类通知...而且我也能够编译项目...在我看来,这很奇怪,因为我有一个实现接口的类,但不是方法。

我在这里做什么错了?

编辑

我的实际代码

    interface ILooperable<in TASK_TYPE, in CALLBACK_TYPE> where CALLBACK_TYPE : ILooperableCallback<TASK_TYPE>  
    {
        void Start();
        void Put(TASK_TYPE task);
        void DeleteTask(TASK_TYPE task);
        void SetCallback(CALLBACK_TYPE callback);
        void Quit();
    }
    interface ILooperableCallback<in TASK_TYPE>
    {
        void Finish(TASK_TYPE task);
    }
    class BaseLooper<TASK_TYPE, CALLBACK_TYPE> where CALLBACK_TYPE : ILooperableCallback<TASK_TYPE>,
        ILooperable<TASK_TYPE, CALLBACK_TYPE>
    {
        //Here I am expect to get lack of interface implementation warning
    }

编辑

换句话说,我该如何告诉BaseLooper我希望它是第二个参数实现ILooperableCallback并自己实现接口呢?

在这一行lass BaseLooper<TASK_TYPE, CALLBACK_TYPE> where CALLBACK_TYPE : ILooperableCallback<TASK_TYPE>中,我告诉我希望它是第二个参数实现ILooperableCallback,对吗?

这行.... ,ILooperable<TASK_TYPE, CALLBACK_TYPE>告诉类自己实现了ILooperable接口,对吧?

2 个答案:

答案 0 :(得分:6)

您的代码是这样的:

interface IInterface<TYPE_ONE, TYPE_TWO>
{
    void foo();
}

class BaseClass<TYPE_ONE, TYPE_TWO> where TYPE_TWO : IInterface<TYPE_ONE, TYPE_TWO>
{
}

该类的声明只是说TYPE_TWO必须实现IInterface<TYPE_ONE, TYPE_TWO>-它没有对实现该接口的类本身做任何说明,因此可以很好地编译。

如果您希望类本身实现该接口,则可以这样编写:

class BaseClass<TYPE_ONE, TYPE_TWO>: IInterface<TYPE_ONE, TYPE_TWO>
{
}

现在它将无法编译:

Error CS0535  'BaseClass<TYPE_ONE, TYPE_TWO>' does not implement interface member 'IInterface<TYPE_ONE, TYPE_TWO>.foo()'

请注意,如果您还想保留对TYPE_TWO的约束,则也可以包括该约束:

class BaseClass<TYPE_ONE, TYPE_TWO>
    : IInterface<TYPE_ONE, TYPE_TWO> 
      where TYPE_TWO : IInterface<TYPE_ONE, TYPE_TWO>
{
}

这将产生相同的编译错误-但在这一点上,我怀疑声明变得有些笨拙且难以理解...

为回答您的问题,您的类的声明应如下所示:

class BaseLooper<TASK_TYPE, CALLBACK_TYPE>
    : ILooperableCallback<TASK_TYPE>
    where CALLBACK_TYPE : ILooperableCallback<TASK_TYPE>, ILooperable<TASK_TYPE, CALLBACK_TYPE>
{
    // ...
}

因此,语法为:

  • 冒号(:)之后的类型定义了类本身必须实现的内容。
  • where之后的类型定义了对类型参数的约束。

答案 1 :(得分:0)

BaseLooper类的代码中,您告诉谁将使用此类,客户端应提供CALLBAK_TYPE的实现,其中CALLBACK_TYPE源自ILooperableCallback<TASK_TYPE>,ILooperable<TASK_TYPE, CALLBACK_TYPE>BaseClass的这种定义并不能说明BaseLooperILooperableCallback<TASK_TYPE>的实现。

interface ILooperable<in TASK_TYPE, in CALLBACK_TYPE> where CALLBACK_TYPE : ILooperableCallback<TASK_TYPE>
{
    void Start();
    void Put(TASK_TYPE task);
    void DeleteTask(TASK_TYPE task);
    void SetCallback(CALLBACK_TYPE callback);
    void Quit();
}
interface ILooperableCallback<in TASK_TYPE>
{
    void Finish(TASK_TYPE task);
}

class BaseLooper<TASK_TYPE, CALLBACK_TYPE> where CALLBACK_TYPE : ILooperableCallback<TASK_TYPE>,
    ILooperable<TASK_TYPE, CALLBACK_TYPE>
{
    //Here I am expect to get lack of interface implementation warning
}

假设您想要一个派生类ClientClass来实现BaseLooper类,那么您将必须提供CALLBACK_TYPE的实现。并且当您尝试实现CALLBACK_TYPE时,肯定会出现所需的错误。