2012-02-18 91 views
2
public interface IMy<T> 
{ 
    T Implementer 
    { 
     get; 
    } 
} 
public class MyClass : IMy<MyClass> 
{ 
    ... 
} 

但我想是这样的:访问类型

public interface IMy 
{ 
    I Implementer 
    { 
     get; 
    } 
} 

请接受,对于一些CA-razy的原因,我需要一个定义,在类型返回一个方法的接口的实施者。没有?好吧,假设它就像一个XML资源管理器,请致电我的界面ITree

接口主要帮助我组织(单独),但是当我有一个要求我依赖于一个约定时,它似乎击败了目的。

+0

第一个片段通常是解决“父需要用子类的类型定义通用接口”问题的方法。我不明白为什么它不适合你。你能详细说明吗? – Irfy 2012-02-19 00:05:27

+0

@Iffy那么,我提到的惯例显然是你必须在IMy 的MyClass上实现,但没有什么能阻止你用IMy 实现。我可能滥用论坛来抱怨模糊的“肮脏”的感觉,但你的评论是一个有效的答案。 – 2012-02-19 00:09:15

+0

就像给任何可能在这里降落的人一样 - 我提出这个问题的动机与对泛型接口类型参数逆变的陌生性有很大关系。回顾过去,我所要求的似乎更加模糊。 – 2012-02-23 00:58:44

回答

1

您希望能够说出:“接口应该知道谁实现了它,并自动提供实现者的类型在其定义中,由实现者继承”?像

public interface IMy 
{ 
    ImplicitImplementerType SomeProperty 
    { 
     get; 
    } 
} 

我敢肯定,这是不可能的。尽管这样的事情可以用更动态的语言来实现(我在这里猜测)。

+0

这就是我所喜欢的,因为肮脏的感觉实际上是作为不必要的代码(接口层次结构,扩展方法)在我的代码中传播的。我会习惯的。 – 2012-02-19 00:30:21

+1

我建议你“感激”已经知道这实际上[非常有用的模式](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern):-)许多程序员编写的代码不知道如何解决逆变问题。 – Irfy 2012-02-19 00:48:50

1

您不能静态指定这样的返回类型。在C#中(和在CLR中)没有“thistype”。但你可以在运行时找到它:

var thisType = this.GetType() 

因为我不认为这是你需要什么,我必须告诉你,这是不可能做到你想要什么。

当然,你的第一个代码片段工作,但你不想这样做。

+0

好的答案,但我不想采取动态暴跌,你正确地认为这是一个奇思妙想。其他人加入评论。谢谢。 – 2012-02-19 00:21:48