**查看“编辑”部分**
我有一个界面
IInterface<TYPE_ONE, TYPE_TWO> where TYPE_TWO : string
{
void foo();
}
然后我有一个BaseClass
class BaseClass<TYPE_ONE, TYPE_TWO> where TYPE_TWO: string
现在我想在BaseClass
,IInterfase
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接口,对吧?
答案 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
的这种定义并不能说明BaseLooper
是ILooperableCallback<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
时,肯定会出现所需的错误。