【问题标题】:Cannot Access Protected Function in Derived Class in C#?无法访问 C# 派生类中的受保护函数?
【发布时间】:2012-06-05 13:00:02
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c#


【解决方案1】:

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

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

虽然:

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

所以:

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

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

【讨论】:

    【解决方案2】:

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

    打电话就行了

    this.Test()
    

    无需在 B 中创建对象 A。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            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() 只能从派生类及其同级中调用。

            用于测试的 sn-p:http://volatileread.com/utilitylibrary/snippetcompiler?id=37293

            【讨论】:

              猜你喜欢
              • 2016-04-07
              • 2017-12-14
              • 2013-10-21
              • 1970-01-01
              • 1970-01-01
              • 2015-12-30
              • 2019-01-20
              • 2016-02-29
              • 2012-05-02
              相关资源
              最近更新 更多