C#Late Binding

时间:2011-10-23 04:04:38

标签: c# binding

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

3 个答案:

答案 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并在派生类的构造函数中设置值。