2013-04-30 85 views
6

我在我的基類中有一個方法返回一個布爾值,我希望這個布爾值可以確定我的派生類中相同的重寫方法會發生什麼。使用基類方法的返回值?

基地:

public bool Debt(double bal) 
    { 
     double deb = 0; 
     bool worked; 

     if (deb > bal) 
     { 
      Console.WriteLine("Debit amount exceeds the account balance – withdraw cancelled"); 
      worked = false; 
     } 
     else 

     bal = bal - deb; 
     worked = true; 

     return worked; 
    } 

衍生

public override void Debt(double bal) 
    { 
     // if worked is true do something 

    } 

注意BAL來自構造我前面

+1

確保您的基類方法是虛擬的:'公共虛擬BOOL德布(雙BAL)'或派生類將只是將其隱藏。只是一個側面說明。 – 2013-04-30 16:58:31

+4

此外返回值類型必須匹配,否則你會得到一個編譯器錯誤,'' .Derived.Debt(double)':返回類型必須是'bool'以匹配被重寫的成員' .Base.Debt(double) 「'。 – 2013-04-30 17:02:56

回答

10

讓你可以使用base關鍵字調用基類方法:

public override void Debt(double bal) 
{ 
    if(base.Debt(bal)) 
     DoSomething(); 

} 

如上面註釋所示,您需要確保基類中具有相同簽名(返回類型和參數)的虛擬方法,或者從派生類中移除override關鍵字。

+1

可能最好在'if'之後包圍該區域,並在那裏做你的東西,而不是調用另一種方法來做到這一點。爲什麼讓你的調用堆棧比它更深? – Jeff 2013-04-30 17:00:17

+0

@Jeff - 我把這個方法調用純粹表示應該在那裏發生一些事情。它可能是內聯語句。 – PHeiberg 2013-04-30 17:03:43

+0

我看到你在得到什麼,除非沒有辦法告訴結果是真是假 – TheAce 2013-04-30 17:05:54

2
if(base.Debt(bal)){ 
    // do A 
}else{ 
    // do B 
} 

base引用基類。所以base.X指的是基類中的X

2

調用base方法:

public override void Debt(double bal) 
{ 
    var worked = base.Debt(bal); 
    //Do your stuff 
} 
1

正如一些人所提到的,您可以使用base.Debt(bal)打電話到你的基類的方法。我也注意到你的基類方法沒有被聲明爲虛擬的。 C#方法在默認情況下不是虛擬的,因此除非您在基類中將其指定爲虛擬,否則您不會在派生類中重寫它。

//Base Class 
class Foo 
{ 
    public virtual bool DoSomething() 
    { 
     return true; 
    } 
} 

// Derived Class 
class Bar : Foo 
{ 
    public override bool DoSomething() 
    { 
     if (base.DoSomething()) 
     { 
      // base.DoSomething() returned true 
     } 
     else 
     { 
      // base.DoSomething() returned false 
     } 
    } 
} 

Here's什麼MSDN不得不說的虛方法

相關問題