当前位置: 首页 > 面试题库 >

派生类可访问性

辛健
2023-03-14
问题内容

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

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

internal class BaseClass
{
}

public class DerivedClass : BaseClass
{
}

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


问题答案:

更新
:这个问题是我在2012年11月13日发布的博客的主题。感谢您提出的好问题!

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

除了其他好的答案之外,请考虑这种情况。您和您的同事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的漏洞。

为什么Java允许使用它?

不知道,对不起。



 类似资料:
  • 我理解您可以从派生类访问基类的成员,然而,我有一个函数需要指向我的基类作为一个整体的指针。例如: 有没有办法从派生类中获得指向这个基类的指针?

  • 我创建了Angular2 Typescript项目。我有很多表格,所以我想有一个类似基本组件的东西。 这是我的基本组件: 现在有我的子组件。我想从http获取所有项目,然后将其分配给基类 知道如何从订阅方法访问基字段吗?

  • 首先,我确实在谷歌上做了一个快速搜索,没有一个解释我拍摄的目的。 我的问题是如何在成员函数中访问该消息,例如(中的虚函数)?父类中没有定义或类似的函数,如果调用恰好是我要重写的函数,那么调用该函数是非常没用的。 我使用的是Visual Studio Community 2015,因此编译器特定的方法是可以的,但我更喜欢可移植的解决方案。

  • 问题内容: 我有一些用Java定义的类,类似于下面的代码。我正在尝试通过派生的Java类进行访问,这在Java中是允许的,但在kotlin中是不允许的。 有没有一种方法可以通过派生类访问字段? 问题答案: 在Kotlin中,嵌套类型和伴随对象不会自动继承。 此行为并非特定于Java,您可以仅在Kotlin中重现相同的行为: 因此,您必须显式地使用基类对嵌套类进行限定。 为了避免Java中与通过派生

  • 问题内容: 与我的其他问题略相关:以下内容之间有什么区别: 同样,最后2个之间的差异是我最感兴趣的。 问题答案: 任何包中的类都可以访问公共类。 具有默认访问权限()的类仅对同一包中的其他类可见。 private和protected修饰符只能应用于内部类。 私有类仅对其封闭类以及同一封闭类中的其他内部类可见。 受保护的类对于同一包中的其他类以及扩展该封闭类的类都是可见的。

  • 除另有说明外,以下所有标准参考均指N4861(2020年3月布拉格后工作草案/C++20 DIS)。 如果基类是可访问的,则可以隐式地将指向派生类的指针转换为指向该基类[...]的指针。 意味着以下示例格式良好: 因为是上(+)的可访问基类。 [...] /5.3作为的成员受到保护,出现在类的成员或友类中,或者出现在从派生的类的成员中,其中作为的成员是公共的、私有的或受保护的,或者 /5.4存在一