繁体   English   中英

实现通用接口

[英]Implementing a generic interface

我有一个通用的界面:

public interface IUnauthorizedRequestRespondable<out T> where T:class 
{
    T GetResponseForUnauthorizedRequest();
}  

(我不确定为什么Resharper建议T“出局”,但这不是问题)。
在我的场景中, GetResponseForUnauthorizedRequest返回的对象始终是实现接口的类型。

所以接口的所有实现都是这样的:

public class SignInReturnedObject : IUnauthorizedRequestRespondable<SignInReturnedObject>  

(类名和括号中的类型始终相同)。
这看起来有点尴尬 - 是不是有一种更简洁的方式来告诉编译器接口的方法返回它所属的类型?

谢谢。

据我所知,目前在C#中没有办法做到这一点。

理论上的侧面说明 :允许您执行此操作的功能称为自我类型,但在C#中不可用。 该功能的想法是,你有一个指的是实际类型的一种特殊类型的this ,所以如果你有一个名为一种特殊类型的self ,你很可能写的是这样的:

public interface IUnauthorizedRequestRespondable { 
    self GetResponseForUnauthorizedRequest(); 
}   

...当你有一个实现接口的类SignInReturnedObject时,用来代替self的实际类型将是SignInReturnedObject ,但不幸的是,那不是
可在C#中找到:-)

如果你想以这种方式使用该模板的唯一方法,我会使用:

public interface IUnauthorizedRequestRespondable<T> where T:IUnauthorizedRequestRespondable<T>
{
    T GetResponseForUnauthorizedRequest();
}

这具有保证不以任何其他方式使用的优点。

课堂宣言不会改变,但我自己并没有看到任何尴尬。 考虑到您正在定义类和它自身之间的关系,任何更简洁的形式可能都是不可取的。

实际上,这总结了它。 这就是语法的工作原理。

您可以在.NET本身使用IEquatable inteface看到它 - 您几乎总是将对象与自身进行比较,但您始终必须提供自己的类名作为模板参数。

这只是为了提供灵活性,以便您可以与任何事物进行比较,而不一定是您自己。

您可以创建非通用版本并使用它,但我认为它比它的价值更麻烦

public interface ICastUnauthorizedRequestRespondable : IUnauthorizedRequestRespondable<SignInReturnedObject>
{
}  

由于T可以是任何类(不必是您正在实现的类),因此您需要为您的类命名。

public class SignInReturnedObject : IUnauthorizedRequestRespondable<ANYCLASS>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM