从派生类访问受保护的方法

本文关键字:方法 受保护 访问 派生 | 更新日期: 2023-09-27 17:52:16

我在基类中有一个受保护的方法:

public class BaseClass
{
  protected virtual void Foo(){}
}    

方法被一个派生类覆盖:

public class Derived1 : BaseClass
{
   protected override void Foo()
    {
     //some code...
    }
}    

另一个派生类有第一个派生类的实例。
当我尝试访问Foo方法(存在于基类中,如上所述)时,我得到一个错误:

 public class DerivedClass2 : BaseClass
    {
     BaseClass instance = new DerivedClass1();
     instance.Foo(); // Here I get an error
    }

我得到的错误:

Error CS1540: Cannot access protected member 'BaseClass.Foo' via a qualifier of type 'BaseClass';   
the qualifier must be of type 'DerivedClass2' (or derived from it)

我明白受保护的成员不应该放弃他们的值给任何其他实例,即使是从相同类型派生的实例,
但是有没有办法不将方法修改为public?

从派生类访问受保护的方法

可以将Foo方法声明为受保护的内部方法....

public class BaseClass
{
  protected internal virtual void Foo(){}
} 
public class Derived1 : BaseClass
{
   protected internal override void Foo()
    {
     //some code...
    }
}

这里的"protected internal"意味着该成员对继承基类的任何类都是可见的,无论它是否在同一个程序集中。该成员还可以通过在同一程序集中的任何地方声明该类型的对象可见。

更新:我刚刚看到这两个类都是从BaseClass派生的。在初始示例中没有指定基类。在这种情况下,解决这个问题的一种方法是创建一个新的AbstractDerived,它将是这两个类的基类。像这样:

public abstract AbstractDevired: BaseClass
{
   protected override Foo()
   {
      //put implementation from Derived1 here
   }
}
public Derived1: AbstractDevired
{
  //no need to override here because it is the same logic in AbstractDerived class
}
public DerivedClass2: Derived1
{
   protected override Foo()
   {
      base.Foo();
      //some code here
   }
}

老回答:您应该从Derived1派生出DerivedClass2,并使用base关键字。您可以在这里找到关于base关键字的更多信息和示例:http://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx在你的例子中,它看起来像这样:

public class DerivedClass2 : Derived1
{
   protected override void Foo()
   {
      base.Foo();
      //some code
   }
}

你可以试试这样做——它隐藏方法的基本版本,并使被覆盖的版本公开。

public class Derived1 : BaseClass
{
    public new void Foo()
    {
        //some code...
    }
}

可以使用内部访问修饰符,它的工作原理与public相同,但不能用于不同的程序集。

MSDN的更多信息:http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx

所以,只需将protected替换为internal。希望对你有所帮助。:)