2011-10-23 89 views
0

我有一個「簡單」的問題,我編寫了一個示例應用程序來說明。我想b.getName()調用返回「barname」,但它不,我不知道如何得到這個工作。我一直在C#工作多年,但目前我覺得自己像一個新手,因爲這個遲到的綁定問題讓我難堪。C#後期綁定

class Program 
{ 
    static void Main(string[] args) 
    { 
     bar b = new bar(); 
     Console.WriteLine(b.getName()); 
     Console.ReadLine(); 
    } 
} 

class foo 
{ 
    string name = "fooname"; 

    public string getName() 
    { 
     return this.name; 
    } 
} 

class bar:foo 
{ 
    string name = "barname"; 
} 
+5

這不是晚期綁定。這只是普通的繼承。 –

+0

謝謝,你說得對。在PHP中工作9到5年太多年了。 (如果等價問題是遲交問題)。 – dudzcom

回答

5

默認情況下你的name變量是私有的 - 這聽起來像你希望它是protected,這樣你就可以覆蓋值 - 這會工作:

class foo 
{ 
    protected string name = "fooname"; 

    public string getName() 
    { 
     return this.name; 
    } 
} 

class bar : foo 
{ 
    public bar() 
    { 
     name = "barname"; 
    } 
} 
+0

是的。我想我可以完成這項工作。應該看到了!你真棒。有時候你的大腦會陷入一種思維方式。 – dudzcom

3

如果你不娶有一個私人類變量,您可以使用重寫的屬性來完成此操作:

class foo 
{ 
    public virtual string Name 
    { 
     get 
     { 
      return "fooname"; 
     } 
    } 
} 

class bar : foo 
{ 
    public override string Name 
    { 
     get 
     { 
      return "barname"; 
     } 
    } 
} 
+0

我也喜歡這個,但是BrokenGlass的反應比較傳統,所以我會盡量走這條路。 – dudzcom

2

這與晚期綁定無關。後期綁定通常是指從名稱在運行時調用方法。

你提供的代碼實際上做的是創建一個新的變量,它與你的基類有權訪問的範圍不同。

爲了獲得所需的效果,您實際上需要1)使基類方法實現爲虛擬,並覆蓋子類中的方法,或2)在基類中更改變量以具有默認的可訪問性的protected,並在派生類的構造函數中設置該值。

+0

謝謝,你是對的。在PHP中工作9到5年太多年了。 (如果等價問題是遲交問題)。 – dudzcom