我有一些這樣的代碼:
public interface Base<TImpl, T1>
where TImpl : Base<TImpl, T1>
{
public T1 Build(TImpl arg);
}
public class Impl1 : Base<Impl1, int>
{
public int Value { get; set; }
public int Build(Impl1 arg)
{
return arg.Value;
}
}
public class Impl2 : Base<Impl2, string>
{
public string Value { get; set; }
public string Build(Impl2 arg)
{
return arg.Value;
}
}
在TImpl一般的說法似乎很丑陋給我。我是否有機會安全地移除TImpl零件,或者移除T1, T2...并可以寫出類似的東西public TImpl.C1 Method(TImpl arg);?
uj5u.com熱心網友回復:
這將是Curiously recurring template pattern 的一個例子。當只有一個實作類時,這沒有多大意義。
這種模式的重點是確保 的引數Impl.Method也是Impl。在提供相同級別的型別安全性的同時,沒有任何簡單的方法可以避免這種模式。
Eric Lippert 是 C# 背后的架構師之一,他在一篇關于這個主題的文章中指出,雖然該模式有一些潛在的用途,但它也有問題(感謝 Matthew Watson 指出)。并得出結論:
我的建議是,在用 C# 實作這種奇怪的模式之前,要仔細考慮;給客戶帶來的好處真的超過了你給代碼維護者帶來的精神負擔所帶來的成本嗎?
您也可以始終忽略型別安全,而只是獲取和回傳物件,但我不建議這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356475.html
上一篇:泛型型別T的Python子類串列
