c#延迟绑定

本文关键字:绑定 延迟 | 更新日期: 2023-09-27 18:12:00

我有一个"简单"的问题,我创建了一个示例应用程序来说明。我希望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";
}

c#延迟绑定

默认情况下,您的name变量是私有的-听起来像您希望它是protected,所以您可以覆盖该值-这将工作:

class foo
{
    protected string name = "fooname";
    public string getName()
    {
        return this.name;
    }
}
class bar : foo
{
    public bar()
    {
        name = "barname";
    }
}

如果你不喜欢使用私有类变量,你可以通过重写属性来实现:

class foo
{
    public virtual string Name
    {
        get
        {
            return "fooname";
        }
    }
}
class bar : foo
{
    public override string Name
    {
        get
        {
            return "barname";
        }
    }
}

这与后期绑定无关。后期绑定通常是指在运行时从名称调用方法。

你所提供的代码实际上是创建一个新的变量,它的作用域与你的基类所访问的作用域不同。

为了获得期望的效果,您实际上需要1)使基类方法实现为虚的,并在您的子类中重写该方法,或者2)在您的基类中将变量更改为具有默认可访问性protected并在派生类的构造函数中设置该值。