【问题标题】:c# - Narrowing and widening on class inheritancec# - 缩小和扩大类继承
【发布时间】:2017-03-17 06:06:00
【问题描述】:

我正在准备 70-483 考试,我对转换类型有疑问。 我读了一本书,每章的末尾都有一些问题/答案,我完全糊涂了。

如果 Manager 类继承自 Employee 类,Employee 和 Customer 类都继承自 Person 类,那么以下哪些属于窄化转换?

一个。将人员转换为经理

b.将员工转变为经理

c。将员工转换为个人

d。将经理转换为人员

e。将经理转变为员工

f。将人员转换为员工

g.将客户转变为员工

h。将员工转变为客户

答案是:

“A, B, F 。(从某种意义上说,您可以将 g 和 h 视为缩小转换,但实际上它们只是无效转换。)”

据我了解,我认为 a,b,f 会扩大转化率

  • 扩大转换是一种转换,其中 原始类型可以在结果类型中表示。

  • 缩小转换是一种转换,其中的某些值
    原始类型不能在结果类型中表示。

【问题讨论】:

    标签: c# type-conversion


    【解决方案1】:

    Person 转换为Manager 不会扩大,因为并非所有Person 对象(原始类型)都可以在结果类型中表示。为什么?因为Customer也是Person,而Customer不能是Manager

    但是,如果我们要从 Manager 转换为 Person,我们可以为每个 Manager 对象执行此操作。没有Manager,我们无法转换为Person。因此,这正在扩大。

    有道理吗?

    【讨论】:

      【解决方案2】:

      如果我这样做

      Person originalType = new Customer();
      Employee resultType = (Employee)originalType; //this line is Example f in the book.
      

      第 2 行将因无效转换异常而失败。这意味着当您转换为Employee 时,Person 的值可能会失败。

      如果你再看看你的两条规则(强调我的)

      • 加宽转换是一种原始类型的每个值都可以在结果类型中表示的转换。
      • 窄化转换是原始类型的某些值无法在结果类型中表示的转换。

      您会看到这属于第二条规则,因为我们确实找到了无法表示为结果类型的原始类型的值。

      【讨论】:

      • 所以我们可以说将引用类型转换为直接或间接祖先是一种扩大转换。 (实际上它不需要显式转换)。
      • 正确,大多数带有隐式转换的东西都是扩大转换。这就是为什么它们允许它们是隐含的。大多数缩小转换范围的事情都需要显式转换(在基本 .NET 框架中,在自定义类中,您可以使用隐式和显式转换来做各种奇怪的事情)。
      【解决方案3】:

      缩小是指为更大组的子集创建类,主要用于存储额外数据。

      因此,当您将人转换为员工时,您是从更小/更窄的群体/类型的角度来看待它(员工是人,但人不一定是员工)。

      同样适用于将员工转换为经理和将人员转换为员工

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多