0

如何在派生类中使用基类的保护函数?

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

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

当我尝试使用基类的测试功能时。它正在抛出错误..

4

6 回答 6

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
  }
}
于 2012-05-31T09:24:08.277 回答
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

于 2015-10-16T18:46:41.100 回答
1

那是因为 'A'sTest()是受保护的,这意味着,B将其视为private.

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

虽然:

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

所以:

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

public class B : A
{
  public void Test2()
  {
    this.Test(); // Will work!
  }
}
于 2012-05-31T09:23:53.453 回答
1

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

打电话

this.Test()

无需在 B 中创建对象 A。

于 2012-05-31T09:23:54.217 回答
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();
  }
}
于 2012-05-31T09:24:42.557 回答
0

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

于 2012-05-31T09:24:04.390 回答