【发布时间】:2010-10-08 17:41:43
【问题描述】:
这段代码:
abstract class C
{
protected abstract void F(D d);
}
class D : C
{
protected override void F(D d) { }
void G(C c)
{
c.F(this);
}
}
产生这个错误:
无法通过“C”类型的限定符访问受保护的成员“C.F(D)”;限定符必须是“D”类型(或派生自它)
他们到底在想什么? (改变这条规则会破坏什么吗?)除了公开 F 之外,还有其他办法吗?
编辑:我现在明白为什么会这样了(感谢Greg),但我仍然对理性感到有些困惑;给定:
class E : C
{
protected override void F(D d) { }
}
为什么不应该 D 能够调用 E.F?
错误消息已被编辑,所以我可能在那里输入了一个错字。
【问题讨论】:
-
您的代码无法编译...看起来 D 应该是从 C 派生的,但它没有显示这一点。如果确实如此,则这些方法具有不同的可见性 D.F,因此不能覆盖 C.F.当您询问有关特定语言语义的问题时,您需要使代码准确。
-
为什么成员 F 应该是可访问的?显然 - 与任何参数/变量一样 - 您只会看到参数 c 的公共接口。
-
@divo:为什么它应该是可访问的?因为我认为没有令人信服的理由不应该这样做?
-
@BCS:受保护方法背后的部分想法是让派生类决定应该使用父类的哪些能力。如果
ReadableFoo提供protected成员来设置其属性,MutableFoo可以从公共设置器中调用这些成员,而`ImmutableFoo` 可以避免这样做;如果ImmutableFoo被密封并且不使用受保护的设置器,则不会使用这些设置器。如果MutableFoo可以访问来自ReadableFoo的任何派生的设置器,那么保护将丢失。
标签: c# overriding protected access-modifiers