无法在派生类中访问变量

时间:2014-09-23 09:01:59

标签: c# .net inheritance

我无法在我的派生类中访问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");
        }
    }

5 个答案:

答案 0 :(得分:4)

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

MyCla

如果您愿意,可以选择创建字段MyCla m = new MyCla(); int x = m.i; internal,这样就可以使程序集中的所有类都可以使用。

这是compiling example

答案 1 :(得分:0)

“protected”关键字表示只有从该类型派生的类型和类型才能访问该成员。

如果您希望能够访问该成员,您有几个选择

  • 公开宣传。
  • 将其设为内部。这将允许任何类型访问同一程序集中的成员(或者如果添加朋友的
  • ,则访问其他程序集)

干杯!

答案 2 :(得分:0)

您正在创建一个新实例:

MyClass m = new MyClass(); 

此实例仅允许您与公共成员进行交互。因此m.i无法正常工作。

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

e.g

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

答案 3 :(得分:0)

您无法在子类中获取受保护的变量,但可以在Child Class方法或Constructor中直接访问,例如。的 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");
    }
}

由于

答案 4 :(得分:-1)

您可以从MyCla类中访问i,但在您的方法“显示”中,您正在创建一个新的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);
    }
}