2012-02-18 90 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