2017-02-16 10 views
1

C#では、継承されたクラスを強制的に実装するために仮想メソッド抽象をマークすることができます。抽象的なオーバーライドとして宣言された基本メソッドを呼び出す方法

class A 
{ 
    public virtual void Method() 
    { 
     Console.WriteLine("A method call"); 
    } 
} 

abstract class B : A 
{ 
    // Class inherited from B are forced to implement Method. 
    public abstract override void Method(); 
} 

私はBから継承されたクラスからMethodA実装を呼び出すしたいと思います。

class C : B 
{ 
    public override void Method() 
    { 
     // I would like to call A implementation of Method like this: 
     // base.base.Method(); 
    } 
} 

これを行う最良の方法は、A実装の保護メソッド "MethodCore"を追加し、必要に応じて呼び出すことです。

class A 
{ 
    public virtual void Method() 
    { 
     MethodCore(); 
    } 

    protected void MethodCore() 
    { 
     Console.WriteLine("A method call"); 
    } 
} 

abstract class B : A 
{ 
    public abstract override void Method(); 
} 

class C : B 
{ 
    public override void Method() 
    { 
     MethodCore(); 
    } 
} 

これを行う方法は他にありますか?

答えて

1

これを行う最良の方法は、A実装の保護されたメソッド "MethodCore"を追加し、必要に応じて呼び出すことです。

はい。 baseを使用してabstractメソッドを呼び出すことはできませんので、Aインスタンスを使用して、Aに最終的にMethodを呼び出す必要があります。言っ

は、それはあなたがBMethodデフォルト実装を提供する方法を探しているように見えるように単にAで実施存在を使用する必要があるメソッドを実装していないBの任意のサブクラス。より良い解決策はMethodをとしてBに表示しないことです。その代わり、base.Method()

abstract class B : A { 
// Class inherited from B are forced to implement Method. 
    public virtual void Method() { 
     base.Method()//calls Method in A 
    } 
} 

この方法を使用してAMethodからBリダイレクトでMethodを作り、呼び出したいBのいずれかのサブクラスがMethodAから単にbase.Method()を言うことができます。

+0

もちろん、特定の実装が必要な場合は、それを提供するだけです。しかし、私は "実装を提供する必要があります"というメリットを失ってしまいます... – Orace

+0

@Orace残念ながら、親クラスのメソッドはオプションではなく、同時に実装する必要はありません。 – CKing

関連する問題