以下是该计划:
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
的名称字段?
答案 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类控制属性时,可以使用override
或new
构造来定义Child类中属性的所需行为。