以下场景中新增和覆盖之间的差异

时间:2017-09-11 19:02:30

标签: c# oop

我的代码如下 -

 public class Class1
    {
        public virtual void Test1()
        {
            Console.WriteLine("This is class 1");
        }
    }

并且

   public class Class2 : Class1
    {
        public override void Test1()
        {
            Console.WriteLine("This is class 2");
        }
    }

现在,如果我打电话 -

 static void Main(string[] args)
    {
        Class1 obj = new Class2();
        obj.Test1();
        Console.ReadLine();
    }

结果:调用Class2中的方法。

但现在我用New keyowrd

更改了代码
 public class Class1
    {
        public void Test1()
        {
            Console.WriteLine("This is class 1");
        }
    }

   public class Class2 : Class1
    {
        public new void Test1()
        {
            Console.WriteLine("This is class 2");
        }
    }

和我上面调用的方式相同 -

static void Main(string[] args)
        {
            Class1 obj = new Class2();
            obj.Test1();
            Console.ReadLine();
        }

但结果不同,结果:调用Class1中的方法。

问题1:使用New关键字时为何结果发生了变化。

问题2:这行代码实际上是做什么的  Class1 obj = new Class2();

我知道它正在创建对象,但后来与

有什么不同

Class1 obj = new Class1();

以上情况让我困惑很多次,然后我开始记住它,就是这样。

请你以外行的方式和逻辑方式解释。

2 个答案:

答案 0 :(得分:1)

区别在于方法调度的发生方式。当您使用new void Test1()时,您正在创建一个新的,名称相同的成员,它只是在词汇上隐藏原始成员:如果您有Class2 thing类型的引用,则会调度thing.Test1()的调用到Class2.Test1方法,因为它隐藏了原始声明。

如果将同一对象分配给类型为Class1的引用,则不再隐藏原始声明,因此在thing.Test1()上调用Class1 thing将导致Class1.Test1调用

当您使用override时,您并非隐藏原始实现;原始实现根本不在派生实例中可用。您已换出原始声明的实现,因此无论您是将对象存储在Class1Class2类型的引用中,都要调用.Test1()将使用重写实现。

答案 1 :(得分:0)