2015-10-07 61 views
1

我試圖在C#中實現模板方法模式。但我找不到一種方法來限制子類覆蓋我的基類模板方法,除非我有兩級深度繼承來使用密封。如何限制在C#中重寫父類方法的子類?

如果我省略虛擬,子類有提供新實現的自由,在這種情況下,它將從子類的引用被調用。相反,我需要一些機制,比如Java中的final,其中我可以限制模板方法在父類中重寫。

+2

你的問題是混亂的。爲什麼你的基本方法甚至需要'虛擬'?如果它不是虛擬的,那麼子類不能覆蓋它 - 它可以提供一個名稱與「new」相同的方法,但如果引用具有基類的類型,則永遠不會調用此方法。如果它不是正確的類型,你可以簡單地將它強制轉換爲基類來強制這個('((Parent)child).Foo()')。如果有人明確地調用'child.Foo()',他們知道他們正在這樣做。 –

+0

無論你是虛擬的還是非虛擬的,你的子類都有能力提供新的實現。一個類不能限制其子類可以/應該做的事情。 – nawfal

回答

3

您的模板方法應該是非虛擬的(它在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 
    } 
} 
+0

感謝您的回覆。 但是我有20個子類,OtherMethod的實現對其中的9個保持不變。所以我沒有把它抽象化。有沒有一種方法可以減少實現的數量。 –

+1

@RaviTiwari這9個孩子班級顯然有一些共同點。爲什麼不添加其他級別的繼承? – royhowie

+0

@RaviTiwari看起來你的課程太大,責任太多。嘗試將它們重構爲更小的類並使用合成來實現所需的功能。深層次的繼承層次通常很難理解。 –

相關問題