2016-12-28 84 views
3

美好的一天, 我有一個虛擬方法,每個實現需要重寫的虛擬方法,但我希望在覆蓋之前先調用基方法。 有沒有辦法實現這一點,而不必實際調用方法。覆蓋方法之前的C#調用方法

public class Base 
{ 
    public virtual void Method() 
    { 
     //doing some stuff here 
    } 
} 

public class Parent : Base 
{ 
    public override void Method() 
    { 
     base.Method() //need to be called ALWAYS 
     //then I do my thing 
    } 
} 

我不能總是依賴base.Method()將在override中被調用,所以我想以某種方式強制它。這可能是某種設計模式,任何完成結果的方法都可以。

+0

,我理解的例子是顯示問題和解決方案就像我提到的可能是一個不同的方法一起 –

+0

http://stackoverflow.com/a/30633107/2920197 –

回答

3

的一種方法是定義在基類中的public方法,它調用覆蓋,可以是(或必須)另一種方法:

public class Base 
{ 
    public void Method() 
    { 
     // Do some preparatory stuff here, then call a method that might be overridden 
     MethodImpl() 
    } 

    protected virtual void MethodImpl() // Not accessible apart from child classes 
    {  
    } 
} 

public class Parent : Base 
{ 
    protected override void MethodImpl() 
    { 
     // ToDo - implement to taste 
    } 
} 
+0

我們有一個'在final'關鍵詞C# ?我不記得那個。 – user3185569

+0

@ user3185569:修改爲使用「public」和「protected」。 – Bathsheba

+0

@Bathsheba thx我實際上使用保護。好的解決方案 –

0

您可以使用裝飾設計模式,採用這種模式,你可以動態地將額外的責任附加到對象上。裝飾提供了一個靈活的選擇子類的擴展功能:

public abstract class Component 
{ 
    public abstract void Operation(); 
} 

public class ConcreteComponent1 : Component 
{ 
    public override void Operation() 
    { 
     //logic 
    } 
} 

public abstract class ComponentDecorator : Component 
{ 
    protected readonly Component Component; 

    protected ComponentDecorator(Component component) 
    { 
     Component = component; 
    } 

    public override void Operation() 
    { 
     if(Component != null) 
      Component.Operation(); 
    } 
} 

public class ConcreteDecorator : ComponentDecorator 
{ 
    public ConcreteDecorator(Component component) : base(component) 
    { 
    } 

    public override void Operation() 
    { 
     base.Operation(); 
     Console.WriteLine("Extend functionality"); 
    } 
} 

希望這有助於!