我有一个“简单”的问题,我创建了一个示例应用程序来说明。我希望b.getName()
调用返回“barname”,但它没有,我不知道如何让它工作。我已经在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";
}
答案 0 :(得分:5)
默认情况下,您的name
变量是私有的 - 听起来您希望它是protected
,因此您可以覆盖该值 - 这样可行:
class foo
{
protected string name = "fooname";
public string getName()
{
return this.name;
}
}
class bar : foo
{
public bar()
{
name = "barname";
}
}
答案 1 :(得分:3)
如果您未与拥有私有类变量结婚,则可以使用重写属性完成此操作:
class foo
{
public virtual string Name
{
get
{
return "fooname";
}
}
}
class bar : foo
{
public override string Name
{
get
{
return "barname";
}
}
}
答案 2 :(得分:2)
这与后期绑定无关。延迟绑定通常是指在运行时从名称调用方法。
您提供的代码实际上做的是创建一个新的变量,该变量与您的基类可以访问的范围不同。
为了获得所需的效果,您实际上需要1)使基类方法实现虚拟,并覆盖您孩子的方法,或2)在基类中更改您的变量以具有默认的可访问性protected
并在派生类的构造函数中设置值。