2014-09-23 59 views
1

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

回答

4

这是因为protected变量和属性只提供给派生类,派生上下文中(从而通过与this引用它),并以当前的类的实例(因此,如果mMyCla它将有工作)。

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

一种选择是让现场internal,或protected internal如果你愿意,这使得它可用于在组件中的所有类。

这是compiling example

+0

护理解释downvote? – 2014-09-23 09:13:22

+2

@Default OP在派生类中的方法中对MyClass进行了类型化,而不是MyCla。 – Kapol 2014-09-23 09:26:06

+0

@PatrickHofman:对不起,这对我的想法看起来不合逻辑(不是你学到的东西,而是这种程序逻辑思想)。直到5年的编程日期为止,我的假设是我可以这样访问它,这就是Protected的含义。但奇怪的是,受保护访问的定义和它的行为看起来相差180度。 – Learner 2014-09-23 09:42:50

0

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

,如果你希望能够访问该成员

  • 设为公开你有几个选项。
  • 使其内部。这将允许任何类型相同的组件内访问的成员(或其他组件时,应当在添加好友的

干杯

0

您正在创建一个新的实例:仅

MyClass m = new MyClass(); 

此实例允许你与公众成员进行交互,因此mi不起作用

在你的派生类MyCla类中,但是你有权访问受保护的字段

e.g

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

男人,我怕你说什么。你编译了它吗?我声称它应该工作,但它不工作,但你说它必须工作。 – Learner 2014-09-23 09:36:02

+0

在Display方法中,您可以从派生类访问该字段。但是你正在创建一个新实例,然后尝试访问该字段。删除行MyClass m = new MyClass(),你会看到你可以访问私人领域。 – Postlagerkarte 2014-09-23 09:43:01

+0

您可能想要运行并查看。谢谢。问题不是私人的,而是受保护的。 – Learner 2014-09-23 09:47:26

-1

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

你不能在子类中受保护的变量,但是,这将是在子类中的方法或直接构造例如访问。 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"); 
    } 
} 

感谢

+0

谢谢,但编程的想法吸了。我不同意了,它不合逻辑。为什么HECK应该可以用“Base”而不是“Object”访问。 MSDN在构造他们的句子或定义继承和受保护的访问方面存在一些混淆。我在编程的5年之前,认为保护手段,我可​​以在派生类访问。哎呀,这对我和微软来说都是一种耻辱,当我在VS控制台中学习时,它的表现会有所不同。 – Learner 2014-09-23 09:41:46