【问题标题】:Property returns string from base class while member returns string from inherited class?属性从基类返回字符串,而成员从继承类返回字符串?
【发布时间】:2015-05-03 07:39:48
【问题描述】:

这是程序:

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,它会神奇地输出:“I am Base”

我很困惑为什么会这样?我调用了MyInheritedClassName属性,MyClassName属性是怎么调用的?或者,MyClassName 属性被调用,它以某种方式神奇地访问了 MyClass 的名称字段?

【问题讨论】:

    标签: c# variables inheritance variable-assignment


    【解决方案1】:

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

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

    正如docs 所说:

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

    如果您想覆盖该行为,可以将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" } };
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 啊哈!所以子类只能访问父类的成员。它不会获得这些成员的副本。
      • @discussedterran 不,它不会获取属性的副本。一点也不
      • 是否获取字段或方法的副本?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多