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()。
这就是为什么您必须在第二课中的'Sub'重新声明中使用'new'关键字。你明确地掩盖了第一类的方法。这里不使用继承或多态。您应该在One.Sub声明中添加'virtual',在Two.Sub声明中删除'new'并在Two.Sub和Three.Sub声明中添加'override' – dureuill
'obj = new classOne();'这里我们引用new键入obj。在这种情况下,对象类型应该改变礼仪?为什么没有发生?为什么它仍然在ClassOne中? – Dhinesh
@Dhinesh - 无论您分配给“obj”,编译器总是会根据“obj”的静态类型做出方法调用决策。运行时类型仅在您调用虚拟方法时使用。 'Add'是虚拟的,所以编译器会调度到正确的版本。 'Sub'不是虚拟的,所以编译器总是调用'classOne'实例。 – Sean