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

时间:2012-05-31 09:21:01

标签: 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函数时。这是投掷错误..

6 个答案:

答案 0 :(得分:2)

您可以直接调用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
  }
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

因为' A' Test()受到保护,这意味着B将其视为private

B继承自A,而A包含受保护的Test这一事实并不意味着其他对象可以访问{{1}即使他们从该类继承。

虽然:

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

所以:

A

答案 3 :(得分:1)

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

致电

this.Test()

无需在B中创建对象A.

答案 4 :(得分:1)

似乎你误解了“受保护”这个词。看一下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();
  }
}

答案 5 :(得分:0)

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