为什么在C#中,不允许派生类具有比其基类更大的可访问性。

例如,这将产生错误:可访问性不一致:与“DerivedClass”类相比,基类“BaseClass”的访问性较差

internal class BaseClass
{
}

public class DerivedClass : BaseClass
{
}

以及为什么在Java中允许它。

最佳答案

更新:这个问题是the subject of my blog on November 13th 2012。感谢您提出的好问题!



除了其他好的答案之外,请考虑这种情况。您和您的同事Alice正在同一装配的不同零件上工作。爱丽丝写了一个类:

public class ComplicatedClass
{
    public void DoDangerousThing() { ... }
}

然后你写
public class EvenMoreComplicatedClass : ComplicatedClass
{
}

伟大的。现在,爱丽丝(Alice)从鲍勃(Bob)那里获得了安全审查,他们意识到(1)从来没有客户需要使用ComplicatedClass,以及(2)DoDangerousThing暴露了可被恶意代码利用的安全漏洞。内部代码当然没有。

因此,爱丽丝将代码更改为
internal class ComplicatedClass
{
    public void DoDangerousThing() { ... }
}

无需在方法上将“public”更改为“internal”,因为public的意思是“对可以看到此类的事物公开”,而现在没有外部代码可以看到此类。

当Alice重新编译此更改后,您的代码应该怎么处理? 它应该无法编译。您已经做出了一个假设,即用户需要查看基类,而Alice所做的更改违反了该假设。安全的做法是让编译器告诉Alice她需要与您联系,以便您可以解决此问题,而不会使客户面临DoDangerousThing的漏洞。



不知道,对不起。

关于c# - 派生类可访问性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6043121/

10-09 04:32