【问题标题】:Why does my conversion/casting fails?为什么我的转换/投射失败?
【发布时间】:2012-05-11 19:20:52
【问题描述】:

程序代码——2个类,B继承自A,TypeH()贴出类字母:

class Program
{
    static void Main(string[] args)
    {
        A z = new A();
        A x = new B();
        B y = (B)x;

        z.TypeH();
        x.TypeH();
        y.TypeH();

        x = (A)y;
        x.TypeH();
    }
}
class A
{
    public virtual void TypeH()
    {
        Console.WriteLine("A");
    }
}
class B : A
{
    public override void TypeH()
    {
        Console.WriteLine("B");
    }
}    

输出:A B B B 为什么最后一个输出是 B 而不是 A?

【问题讨论】:

  • 考虑这一点:您正在将 B 对象转换为 A 对象,但是从行 A x = new B() 您已经知道,当 B 转换为 A 时,调用的方法是来自 B 的方法。 . 所以你应该期待最终的结果是一样的。为了详细了解谷歌 csharp 中的覆盖是如何工作的.. 那里有带有图表的解释,可以清除您的任何疑问

标签: c# inheritance casting type-conversion


【解决方案1】:

这称为多态性。实例很重要(B)而不是类型引用(A)。

【讨论】:

    【解决方案2】:

    因为方法 TypeH 是virtual
    如果您删除了虚拟,那么您将获得派生引用类型的派生方法和基本引用类型的基本方法。使用 virtual 时有一个运行时检查 - 如果基本 ref 实际上指向派生类型,则调用派生方法。

    【讨论】:

      【解决方案3】:

      调用虚方法时,考虑对象的实际实例类型,而不是用于进行方法调用的编译时类型。

      【讨论】:

        【解决方案4】:

        简单来说,这是因为 override 关键字将“替换”基类 A 上的方法,即使您强制转换为该基类,它仍然如此。

        但是,如果您将 B 类更改为:

        public new void TypeH()
        

        那么new 关键字将隐藏 TypeH 的基类A 实现。在这种情况下,当您向下转换为基类 A 时,您将获得 TypeH 的基类 A 实现。然后,您的示例将打印“A”。

        【讨论】:

          猜你喜欢
          • 2017-12-02
          • 2016-07-10
          • 2013-09-15
          • 1970-01-01
          • 1970-01-01
          • 2016-10-04
          • 2018-06-14
          • 2012-07-25
          相关资源
          最近更新 更多