我在基类中有一个受保护的方法:
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)
我理解受保护的成员不应该将它们的值放弃到任何其他实例,即使是从相同类型派生的实例,
但是有没有办法不将方法修改为公开?
4 回答
您可以将Foo方法声明设为受保护的内部....
这里的“protected internal”意味着该成员对继承基类的任何类都是可见的,无论它是否在同一个程序集中 . 通过在同一程序集中的任何位置声明该类型的对象,也可以看到该成员 .
你可以试试这个隐藏方法的基本版本并使被覆盖的版本公开 .
您可以使用内部访问修饰符,它将与public一样工作,但不能使用不同的程序集 .
有关MSDN的更多信息:http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx
所以,只需用内部替换protected . 希望,它可以帮助你 . :)
更新:我刚刚看到这两个类都是从BaseClass派生的 . 在初始样本中没有指定基类 . 在这种情况下,解决此问题的一种方法是创建一个新的AbstractDerived,它将是这两个类的基类 . 像这样的东西:
旧答案:您应该从Derived1派生DerivedClass2并使用 base 关键字 . 您可以在此处找到有关 base 关键字的更多信息和示例:http://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx在您的情况下,它看起来像这样: