2010-08-27 36 views
3

是否有可能從B類的實例調用方法A.F()除了使用重構。謝謝..我可以調用基地重寫方法


    class Program 
    { 
    public class A 
    { 
     public virtual void F() 
     { 
     Console.WriteLine("A"); 
     } 
    } 
    public class B : A 
    { 
     public override void F() 
     { 
     Console.WriteLine("B"); 
     } 
    } 

    static void Main(string[] args) 
    { 
     B b = new B(); 

     //Here I need Invoke Method A.F() , but not overrode..  

     Console.ReadKey(); 
    } 
    }

回答

6

可以使用new關鍵字具有相同的(命名)方法的另一種定義。根據參考的類型,您可以撥打電話AB的實施。

public class A 
{ 
    public void F() 
    { 
    Console.WriteLine("A"); 
    } 
} 
public class B : A 
{ 
    public new void F() 
    { 
    Console.WriteLine("B"); 
    } 
} 

static void Main(string[] args) 
{ 
    B b = new B(); 

    // write "B" 
    b.F(); 

    // write "A" 
    A a = b; 
    a.F(); 
} 

如果你覺得new是不是正確的解決方案,你應該考慮寫兩個方法,一個專有名稱。


通常,如果方法被正確覆蓋,則不能從類的外部調用基類實現。這是一個面向對象的概念。你必須有另一種方法。有四種方法(我能想到)來指定這種尊貴的方法:

  • 用另一個名字編寫一個方法。
  • 編寫一個具有相同名稱但具有另一個簽名(參數)的方法。它被稱爲超載。
  • 使用相同的名稱編寫方法的新定義(使用關鍵字new)它被稱爲隱藏。
  • 將它放到接口上並至少實現一個。 (類似於new,但基於接口)
1

您可以在派生類中使用base.method()來調用基類中的方法。

+0

是的,我知道這個...但我想執行A.F()從主函數,而不是派生類.. – Yuriy 2010-08-27 12:25:26

0

我不知道,如果你可以直接調用基方法(可能是一個瘋狂的把戲在那裏,我不知道的)。作爲一個輕微的選擇,你可以向B類添加方法嗎?如果是這樣,添加:

public void F (int i) 
{ 
    base.F(); 
} 

而且使用叫它:

b.F(1); 
1

只能從類定義本身中調用基方法。所以如果你有需要這樣做,你必須在那裏做。這可能歸結爲你必須重載該方法來從外部來源調用基本方法(類似於@Edward Leno mentiods)。

class Program 
    { 
    public class A 
    { 
     public virtual void F(bool useBase) 
     { 
     Console.WriteLine("A"); 
     } 
    } 
    public class B : A 
    { 
     public override void F(bool useBase) 
     { 
     if(useBase) base.F(); 
     else Console.WriteLine("B"); 
     } 
    } 


    static void Main(string[] args) 
    { 
     B b = new B(); 

     //Here I need Invoke Method A.F() , but not overrode..  
     b.F(true); 

     Console.ReadKey(); 
     } 
    } 
    } 
相關問題