我試圖在C#中實現模板方法模式。但我找不到一種方法來限制子類覆蓋我的基類模板方法,除非我有兩級深度繼承來使用密封。如何限制在C#中重寫父類方法的子類?
如果我省略虛擬,子類有提供新實現的自由,在這種情況下,它將從子類的引用被調用。相反,我需要一些機制,比如Java中的final,其中我可以限制模板方法在父類中重寫。
我試圖在C#中實現模板方法模式。但我找不到一種方法來限制子類覆蓋我的基類模板方法,除非我有兩級深度繼承來使用密封。如何限制在C#中重寫父類方法的子類?
如果我省略虛擬,子類有提供新實現的自由,在這種情況下,它將從子類的引用被調用。相反,我需要一些機制,比如Java中的final,其中我可以限制模板方法在父類中重寫。
您的模板方法應該是非虛擬的(它在C#中是默認的)。它應該調用子類覆蓋的受保護的虛擬/抽象方法。
例如
public abstract class Base
{
public void TemplateMethod()
{
//do sth
OtherMethod();
//do sth more
}
protected abstract void OtherMethod();
}
public class Child : Base
{
protected override void OtherMethod()
{
//provide implementation
}
}
感謝您的回覆。 但是我有20個子類,OtherMethod的實現對其中的9個保持不變。所以我沒有把它抽象化。有沒有一種方法可以減少實現的數量。 –
@RaviTiwari這9個孩子班級顯然有一些共同點。爲什麼不添加其他級別的繼承? – royhowie
@RaviTiwari看起來你的課程太大,責任太多。嘗試將它們重構爲更小的類並使用合成來實現所需的功能。深層次的繼承層次通常很難理解。 –
你的問題是混亂的。爲什麼你的基本方法甚至需要'虛擬'?如果它不是虛擬的,那麼子類不能覆蓋它 - 它可以提供一個名稱與「new」相同的方法,但如果引用具有基類的類型,則永遠不會調用此方法。如果它不是正確的類型,你可以簡單地將它強制轉換爲基類來強制這個('((Parent)child).Foo()')。如果有人明確地調用'child.Foo()',他們知道他們正在這樣做。 –
無論你是虛擬的還是非虛擬的,你的子類都有能力提供新的實現。一個類不能限制其子類可以/應該做的事情。 – nawfal