我的代码如下 -
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();
以上情况让我困惑很多次,然后我开始记住它,就是这样。
请你以外行的方式和逻辑方式解释。
答案 0 :(得分:1)
区别在于方法调度的发生方式。当您使用new void Test1()
时,您正在创建一个新的,名称相同的成员,它只是在词汇上隐藏原始成员:如果您有Class2 thing
类型的引用,则会调度thing.Test1()
的调用到Class2.Test1
方法,因为它隐藏了原始声明。
如果将同一对象分配给类型为Class1
的引用,则不再隐藏原始声明,因此在thing.Test1()
上调用Class1 thing
将导致Class1.Test1
调用
当您使用override
时,您并非隐藏原始实现;原始实现根本不在派生实例中可用。您已换出原始声明的实现,因此无论您是将对象存储在Class1
或Class2
类型的引用中,都要调用.Test1()
将使用重写实现。
答案 1 :(得分:0)