2017-02-16 92 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繼承的類調用A實施Method

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

我覺得要做到這一點,最好的辦法是在一個實施過程中添加保護法「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

這就是說,它看起來像你正在尋找一種方式來提供默認實施MethodB使得未實現此方法應只使用本實施AB任何子類。更好的解決方案是將Method標記爲abstractB。相反,使用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 
    } 
} 

這樣在A使MethodB重定向Method,想要調用B任何子類MethodA可以簡單地說base.Method()

+0

當然,如果我想要一個特定的實現,我只需要提供它。但是我放棄了「你必須提供一個實現」的好處...... – Orace

+0

@Orace不幸的是,父類中的方法不能是可選的並且必須同時實現。 – CKing

相關問題