繁体   English   中英

无法在C#的派生类中访问受保护的功能?

[英]Cannot Access Protected Function in Derived Class in C#?

如何在派生类中使用基类的保护功能?

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    A obj = new A();
    obj.Test(); // error thrown;
  }
}

当我尝试使用基类的Test函数时。 它抛出错误。

您可以直接调用Test()方法,而不必创建基本类型的新对象:

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    Test();  // Calls the test method in the base implementation of the CURRENT B object
  }
}

我认为可以通过基类中受保护的静态方法来做到这一点,而不会丢失封装。

public class A
{
  protected void Test() { /* ... */ }

  protected static void Test(A obj)
  {
    obj.Test();
  }
}

public class B : A
{
  public void Test2()
  {
    A obj = new A();
    A.Test(obj);
  }
}

有效地,只能从派生类及其兄弟中调用A.Test()

用于测试的代码段: http : //volatileread.com/utilitylibrary/snippetcompiler?id=37293

这是因为'A的Test()受保护,这意味着B认为它是private

B继承自A ,并且A包含受保护的Test事实并不意味着其他对象也可以访问Test ,即使它们从该类继承。

虽然:

由于B继承自A ,因此B包含私有方法Test() 因此, B可以访问它自己的Test函数,但这并不意味着B可以访问ATest函数。

所以:

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    this.Test(); // Will work!
  }
}

测试在对象A的实例内受到保护。

刚打电话

this.Test()

无需在B内创建对象A。

似乎您误解了“受保护”一词。 看看msdn: http//msdn.microsoft.com/en-us/library/bcd5672a (v = vs.71) .aspx

您的示例需要像这样:

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    this.Test();
  }
}

受保护的方法仅适用于派生类型。 换句话说,当您创建A的实例时,您尝试公开访问该方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM