C#受保护的成员可通过基类变量[重复]
-
11-09-2019 - |
题
这个问题已经有一个答案在这里:
- 为什么我不能接C#受保护的成员除了这样? 7的答案
它可能似乎相当新手的问题,但是你可以解释为什么方法Der。B()不能接受保护Foo通过基类变量?这看起来怪怪的,对我说:
public class Base
{
protected int Foo;
}
public class Der : Base
{
private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member
private void D(Der d) { Foo = d.Foo; } // OK
}
谢谢!
解决方案
这是一个常问问题。找出为什么这是非法的,认为有关什么可以去错误的。
假设你已经另一个源类Frob来自基地。现在你通过一个实例Frob到Der。B.你应该能够访问Frob.Foo从Der。B?不,绝对不是。Frob.Foo得到保护;它应该只可从Frob和亚类的Frob.德是不Frob并不是一个子类的Frob,所以它没有获得Frob的保护成员。
如果这还不清楚,看看我的文章的主题:
http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx
其他提示
B你想要访问一个受保护的成员的另一类。事实上你是继承这类是无关紧要的。在D访问了受保护的成员的基本类中的当前类。在这方面,你可以访问东西从德和受保护的成员的类型,这是继承。
你可以绕过这种限制由宣布一个静态的方法的基类:
public class Base
{
protected int Foo;
protected static int GetFoo(Base b)
{
return b.Foo;
}
}
public class Der : Base
{
private void B(Base b) { Foo = GetFoo(b); } // OK
}
简单地说,保护的允许访问的子类。
在:
private void B(Base b) { Foo = b.Foo; }
你正在尝试接受保护的成员的实例Der没有访问。这只会对它的访问,如果这是基本类中的当前实例的Der(此)。
private void D(Der d) { Foo = d.Foo; } // OK
工作正常,因为你会通过Der访问它的基类保护的方法。
在这种情况下,你们想你会希望使用"内部"int Foo。
不隶属于 StackOverflow