代码之家  ›  专栏  ›  技术社区  ›  Oren A

实现通用接口

  •  3
  • Oren A  · 技术社区  · 14 年前

    我有一个通用接口:

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

    (我不确定为什么Resharper推荐T是“out”,但这不是问题所在)。
    在我的场景中,返回的对象 GetResponseForUnauthorizedRequest 始终属于实现接口的类型。

    所以所有接口的实现看起来像:

    public class SignInReturnedObject : IUnauthorizedRequestRespondable<SignInReturnedObject>  
    

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

    谢谢。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Jon Hanna    14 年前

    如果您想使用该模板的唯一方式是这样,我将使用:

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

    类声明不会改变,但我自己并不觉得有什么尴尬。考虑到您正在定义类与自身之间的关系,任何更简洁的形式都可能是不可取的。

        2
  •  4
  •   Tomas Petricek    14 年前

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

    理论上的旁注 :允许您执行此操作的功能称为 但这在C#是不可用的。该特性的思想是,您有一个特殊类型,它指的是 this ,所以如果您有一个特殊类型 self

    public interface IUnauthorizedRequestRespondable { 
        self GetResponseForUnauthorizedRequest(); 
    }   
    

    …和实际使用的类型 自己 当你上课的时候 SignInReturnedObject 重要移交对象
    提供C#:-)

        3
  •  0
  •   riwalk    14 年前

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

    IEquatable interface——你几乎总是在比较一个对象和它本身,但是你总是必须提供你自己的类名作为模板参数。

        4
  •  0
  •   Scott Chamberlain    14 年前

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

    public interface ICastUnauthorizedRequestRespondable : IUnauthorizedRequestRespondable<SignInReturnedObject>
    {
    }  
    
        5
  •  0
  •   Numenor    14 年前

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

    public class SignInReturnedObject : IUnauthorizedRequestRespondable<ANYCLASS>