无法访问派生类中的变量

本文关键字:变量 派生 访问 | 更新日期: 2023-09-27 18:23:57

我无法访问派生类中的im.i不工作。为什么?

 public class MyClass
    {
        protected int i;
        public MyClass()
        {
        }
        public virtual void Display()
        {
            Console.WriteLine("Base dis");
        }
    }
    public class MyCla : MyClass
    {
        public MyCla()
        {

        }
        int ij = 12;
        public new void Display()
        {
            MyClass m = new MyClass();
            // m.i is inaccessible here
            Console.WriteLine("Derived dis");
        }
    }

无法访问派生类中的变量

这是因为protected变量和属性仅可用于派生类、派生上下文中(因此通过用this引用它)以及当前类的实例(因此,如果mMyCla,它会起作用)。

MyCla m = new MyCla();
int x = m.i;

一个选项是使字段internalprotected internal(如果愿意)可用于程序集中的所有类。

下面是一个编译示例。

"protected"关键字意味着只有一个类型和从该类型派生的类型才能访问该成员。

如果你想访问该成员,你有几个选项

  • 公开它
  • 让它在内部。这将允许任何类型访问同一程序集中的成员(如果您添加好友的,则访问其他程序集中的

干杯!

您不能在子类中获得受保护的变量,但可以在子类方法或构造函数中直接访问,例如base.i

public class MyCla : MyClass
{
    public MyCla()
    {
        base.i=100;
    }
    int ij = 12;
    public new void Display()
    {
        MyClass m = new MyClass();
        base.i=100; // Accessible
        m.i = 100; // Not Accessible
        Console.WriteLine("Derived dis");
    }
}

如果您希望该变量可通过对象访问,则将其公开。

public int i;
public MyClass()
{
}
public class MyCla : MyClass
{
    public MyCla()
    {

    }
    int ij = 12;
    public new void Display()
    {
        MyClass m = new MyClass();
        m.i = 100; // accessible
        Console.WriteLine("Derived dis");
    }
}

感谢

您正在创建一个新实例:

MyClass m = new MyClass(); 

此实例仅允许您与公共成员进行交互。因此,m.i不起作用。

然而,在派生类MyCla类中,您可以访问受保护的字段。

例如

public new void Display()
{
           i = 1; //this will work
}

您可以从MyCla类中访问i,但在方法"Display"中,您正在创建一个新的MyClass对象,因此它与MyCla完全无关。

以下是如何访问变量"i"的代码示例:

public class MyClass
{
    protected int i;
    public MyClass()
    {
    }
    public virtual void Display()
    {
        Console.WriteLine("Base dis");
    }
}
public class MyCla : MyClass
{
    public MyCla()
    {
    }
    int ij = 12;
    public new void Display()
    {
        Console.WriteLine(this.i);
    }
}