2011-01-29 36 views
8

是否有可能創建一個基類如下所示:是否有可能使抽象方法的參數列表具有可重寫的長度和類型?

public abstract class baseClass 
{ 
    public abstract void SetParameters(/*want this to be adjustable*/); 
} 

,使得重寫它可以定義參數類必需的? 換句話說,我想迫使被覆蓋的方法,而是把它留給什麼這裏需要壓倒一切的類 - 這樣一個可能是

public class derivedClass1 : baseClass 
{ 
    public override void SetParameters(Point a, int b); 
} 

,而另一個可能是

public class derivedClass2 : baseClass 
{ 
    public override void SetParameters(List<Line> a, Point b, Point c, bool e); 
} 

感謝您的幫助,您可以給

+0

您是否在最後兩個例子中說公共類derivedClass:baseClass`? – 2011-01-29 19:10:54

+0

對不起,是的。我會改變它 – simonalexander2005 2011-01-29 19:12:11

回答

10

絕對不是 - 這將打破其在首位的抽象方法的一半的點 - 沒有人會能夠調用它,因爲他們不知道哪個方法簽名實際上已被寫入。抽象類的全部要點是客戶可以參考BaseClass類型,而不必關心實際實現的類型。

如果基類能夠預先預測哪些類型可能會涉及,那麼使調用者更容易生活的一種可能性是具有最普通的簽名(通常是具有最多參數的簽名)抽象,並且使各種過載,其中稱爲通常爲客戶端未指定的參數提供默認值。

0

不,這是不可能的。重寫方法需要完全匹配參數 - 它與實現接口相同。您可能對double-dispatch模式感興趣。

0

如果參數全部設置爲相同類型並且數量相同(我不確定您是否可以使用參數T [],但是如果可以的話,那麼您也可以調整它)。您可以通過使用仿製藥,如@ simonalexander2005實現說

public abstract class baseClass<T> where T : class 
{ 
    public abstract T SetParameters(params T[] parameters); 
} 

其由你來決定派生類中有多少參數使用。但是,即時通訊不知道,如果它是一個良好的做法...

相關問題