属性从基类返回字符串,而成员从继承类返回字符串?

时间:2015-05-03 07:39:49

标签: c# variables inheritance variable-assignment

以下是该计划:

public class Program
{
    static void Main()
    {
        MyInheritedClass InheritInstance = new MyInheritedClass();
        Console.WriteLine(InheritInstance.name); // the name field
    }
}

public class MyClass
{
    public string name= "I am the Base"; // the name field
    public string Name   // the Name property
    {
        get
        {
            return this.name;
        }
    }
}

public class MyInheritedClass : MyClass
{
    new public string name= "I inherit Base";
}

这可以按预期工作。输出是:"我继承Base"

现在,如果我将Console.WriteLine(InheritInstance.name); // the name field更改为Console.WriteLine(InheritInstance.Name); // the name property,则会神奇地输出:"我是Base"

我很困惑为什么会这样?我调用Name的{​​{1}}属性,如何调用MyInheritedClass的{​​{1}}属性?或者可能调用Name的{​​{1}}属性,它以某种方式神奇地访问MyClass的名称字段?

2 个答案:

答案 0 :(得分:2)

  

现在,如果我更改Console.WriteLine(InheritInstance.name); // 名字   字段到Console.WriteLine(InheritInstance.Name); // 名字   财产,它神奇地输出:“我是基地”

这是因为MyClass不知道派生类中的new运算符。据它所知,它只有一个名为Name的字符串字段,它在基类中声明。当属性通过getter检索它时,它会转到那里声明的name

正如docs所说:

  

当用作声明修饰符时,新关键字会显式隐藏   从基类继承的成员。当您隐藏   继承成员,成员的派生版本替换基础   班级版

如果您要覆盖该行为,可以将name声明为virtual

public class MyClass
{
    public string name = "I am the Base";
    public virtual string Name { get { return this.name; } }
}

public class MyInheritedClass : MyClass
{
    public new string name = "I inherit Base";
    public override string Name { get { return this.name } };
}

注意这看起来和感觉多余。您可以通过声明单个virtual属性来避免这种情况:

public class MyClass
{
    public virtual string Name { get { return "I am base" } }
}

public class MyInheritedClass : MyClass
{
    public override string Name { get { return "I am derived" } };
}

答案 1 :(得分:0)

它调用您的基类属性,因为Name属性仅在基类中定义。这是继承的默认和最简单的行为。您可以从基类访问属性。

当您需要从Base类控制属性时,可以使用overridenew构造来定义Child类中属性的所需行为。