2014-02-11 58 views
0

如何在子類中重寫DerivedZ(),而無需在基類中指定U?後一種解決方案顯得有點過分。C#,使用self作爲基類的抽象重寫方法的參數

public abstract class Z {} 
public class DerivedZ : Z 
{ 
    public DerivedZ (B someB, int num) 
    { 
     // initialize here 
    } 
} 

// will not compile 
// error: 'B.GetZ(B, int)': no suitable method found to override 
// error: 'B' does not implement inherited abstract member 'A<DerivedZ>.GetZ(A<DerivedZ>, int)' 
public abstract class A<T> where T : Z 
{ 
    public abstract T GetZ (A<T> inputA, int optional=1); 
} 

public class B : A<DerivedZ> 
{  
    public override DerivedZ GetZ (B someB, int optional=1) 
    { 
     return new DerivedZ (someB, optional) 
    } 
} 

這個工程雖然...

public abstract class A<T,U> where T : Z where U : A<T,U> 
{ 
    public abstract T GetZ (U inputA, int optional=1); 
} 

public class B : A<DerivedZ,B> 
{ 
    public override DerivedZ GetZ (B someB, int optional=1) 
    { 
     return new DerivedZ (someB, optional); 
    } 
} 
+1

您已經展示瞭如何完成這項工作。錯誤信息(你沒有打算列出)很清楚爲什麼你的第一個解決方案不起作用。 – Servy

+1

簡單的答案:你不能。 – MarcinJuraszek

+0

'DerivedZ' *需要*接受'B',而不是'A '? 'B'中的'GetZ' *是否需要*接受'B'而不是'A '? – Servy

回答

4

不能使用第一種形式,因爲它沒有正確重寫方法。如果您做到這一點,試想這樣的代碼:

public class C : A<DerivedZ> {} 

A<DerivedZ> x = new B(); 
x.GetZ(new C()); 

這應該做工精細,畢竟 - A<T>.GetZ剛剛宣佈接受A<T>,並且C一個A<DerivedZ>

你顯示的方法很好。

我同意有時可以說「某些相同類型的東西」,但它不是C#類型系統的一部分。

+0

再次感謝Jon的確認,雖然我留意你的注意力,但我想我可能會問你是否可以寫一篇關於繼承的作文設計的簡短博客文章,如果你願意,我會非常感激;) – user2994682

+1

嗯,我寫了這篇文章超過6年前:https://msmvps.com/blogs/jon_skeet/archive/2006/03/04/inheritancetax.aspx雖然我現在可能更好地表達自己:) –

+0

我相信它的大部分仍然相關,乾杯! – user2994682

相關問題