C# 方法隐藏和;新";关键词

C# 方法隐藏和;新";关键词,c#,C#,在我的一生中,我从未理解过“方法隐藏”,尽管有关于它的所有文档 重写意味着在派生类中使用实现。我认为隐藏(通过使用“new”关键字)意味着使用基类定义是对的吗?在这种情况下,为什么要在继承的类中编写方法 实际上,我的两个问题是: 隐藏是否与覆盖相反 新关键字(用于隐藏)做什么?何时/何地使用?基类?继承类 有什么有用的现实例子吗 你的理解有点错误 首先,重写方法意味着即使将实例强制转换为其基类型,也将使用新的实现,因为虚拟方法表中有一个正确的条目 隐藏方法时,当实例被强制转换为其基类型时,将使用

在我的一生中,我从未理解过“方法隐藏”,尽管有关于它的所有文档

重写意味着在派生类中使用实现。我认为隐藏(通过使用“new”关键字)意味着使用基类定义是对的吗?在这种情况下,为什么要在继承的类中编写方法

实际上,我的两个问题是:

  • 隐藏是否与覆盖相反
  • 新关键字(用于隐藏)做什么?何时/何地使用?基类?继承类
  • 有什么有用的现实例子吗

  • 你的理解有点错误

    首先,重写方法意味着即使将实例强制转换为其基类型,也将使用新的实现,因为虚拟方法表中有一个正确的条目

    隐藏方法时,当实例被强制转换为其基类型时,将使用基实现,因为虚拟方法表中没有条目

    给定以下类定义:

    public class Base
    {
        public virtual void Say()
        {
            Console.WriteLine("Hello World!");
        }
    }
    
    public class A : Base
    {
        public new void Say()
        {
            Console.WriteLine("42");
        }
    }
    
    public class B : Base
    {
        public override void Say()
        {
            Console.WriteLine("Goodbye, Cruel World!");
        }
    }
    
    以下代码将产生:

    var a = new A();
    var b = new B();
    var aAsBase = a as Base;
    var bAsBase = b as Base;
    
    a.Say(); // 42
    aAsBase.Say(); // Hello World!
    
    b.Say(); // Goodbye, Cruel World!
    bAsBase.Say(); // Goodbye, CruelWorld!
    

    第二个代码段第4行的输入错误:
    var bAsBase=b as Base;//不是a
    ,但为什么要使用“new”关键字呢?在我的实验中,无论是否使用它,它的功能都是相同的。唯一的区别是编译器警告。