2016-12-28 13 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()がオーバーライドで呼び出されることを頼ることはできないので、私は何とかそれを強制したいと思います。これは何らかの種類のデザインパターンかもしれませんが、結果を達成するためのアプローチがあります。

+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"); 
    } 
} 

関連する問題