2014-02-20 132 views
0

A类: -新对象创建C#

class classOne 
{ 
    public int intOne = 0; 
    public int Sub() 
    { 
     return 1; 
    } 
    public virtual int Add() 
    { 
     return 1; 
    } 
} 

二班: -

class classTwo:classOne 
{ 
    public new int Sub() 
    { 
     return 2; 
    } 
    public override int Add() 
    { 
     return 2; 
    } 

} 

第三类

class classThree : classTwo 
{ 
    public int Sub() 
    { 
     return 3; 
    } 

} 

的Program.cs

classOne obj = new classOne(); 
classThree obj3 = new classThree(); 
obj = obj3; 
Console.WriteLine(obj.Sub()); 

输出为1.

我的疑问是我用classOne初始化了一个obj,然后使用新的关键字classThree obj3 = new classThree();为ClassThree分配了同一个对象。它如何叫classOne.sub()。这是怎么发生的?我的理解是,它应该调用classThree.Sub()。

回答

1

您尚未将Sub设为虚拟,因此编译器将使用该变量的静态类型来确定要调用哪个实例。由于obj的静态类型为classOne,因此它将调用classOne.Sub()

+1

这就是为什么您必须在第二课中的'Sub'重新声明中使用'new'关键字。你明确地掩盖了第一类的方法。这里不使用继承或多态。您应该在One.Sub声明中添加'virtual',在Two.Sub声明中删除'new'并在Two.Sub和Three.Sub声明中添加'override' – dureuill

+0

'obj = new classOne();'这里我们引用new键入obj。在这种情况下,对象类型应该改变礼仪?为什么没有发生?为什么它仍然在ClassOne中? – Dhinesh

+0

@Dhinesh - 无论您分配给“obj”,编译器总是会根据“obj”的静态类型做出方法调用决策。运行时类型仅在您调用虚拟方法时使用。 'Add'是虚拟的,所以编译器会调度到正确的版本。 'Sub'不是虚拟的,所以编译器总是调用'classOne'实例。 – Sean