理論問題的種類。相當長的時間,如果你沒有理論的心情,可以隨意跳過。是否有可能在C#中爲泛型創建「此類型」?
想象一下,你有兩個類,一個從另一個繼承。基類是通用的,並且在關閉類型中必須返回該關閉類型的某個實例。
像這樣(注意:???文本):
public class Adapter<T>
{
public virtual ??? DoSomething()
{
...
}
}
public class AdaptedString : Adapter<String>
{
public override AdaptedString DoSomething()
{
...
}
}
,因爲沒有辦法來指代從一個泛型類型派生封閉式我不能這樣做。 (對於破碎的語言,抱歉,只是不知道如何表達它。)沒有設置關鍵字來代替???
來指定此方法將返回將從此泛型類型派生的類型實例。
相反,我可以使用顯式傳遞類型名稱到泛型基地的解決方法。但它看起來多餘。
public class Adapter<TThis,T>
{
public virtual TThis DoSomething()
{
...
}
}
public class AdaptedString : Adapter<AdaptedString,String>
{
public override AdaptedString DoSomething()
{
...
}
}
如果在基類中我需要訪問TThis
實例的成員,我要補充的約束。這一次,它看起來醜陋 - 注意約束:
public class Adapter<TThis,T>
where TThis : Adapter<TThis, T>
{
protected int _field;
...
public bool Compare(TThis obj)
{
return _field == obj._field;
}
}
public class AdaptedString : Adapter<AdaptedString,String>
{
...
}
是的,這是所有工作,但它會更好看,如果我可以簡單地使用一些關鍵字,而不是???
在第一個代碼片段。類似於「thistype」。
您認爲它會起什麼作用?它有用嗎?或者,也許這只是簡單的愚蠢?
+1我站在更正:) –
喬恩,在你的例子中的第二行只是不同的東西,不落入這種模式。如果有必要,可以通過現有的語法來實現。 我只是覺得這個語法讓我的例子更加複雜。在我們的代碼中發現錯誤後,我寫了這篇文章。前一段時間我最初編寫了這個基類,但我不得不重讀幾遍以再次抓握。難怪其他人介紹了一個bug。 – XOR
@XOR:我的觀點是第二行是* legal *,但不受歡迎(在這種情況下)。我將編輯答案以使其更清楚。 –