无法访问派生类中的变量
本文关键字:变量 派生 访问 | 更新日期: 2023-09-27 18:23:57
我无法访问派生类中的i
。m.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
引用它)以及当前类的实例(因此,如果m
是MyCla
,它会起作用)。
MyCla m = new MyCla();
int x = m.i;
一个选项是使字段internal
或protected 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);
}
}