2011-10-23 49 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