Oop 创建新对象C#
A类:-Oop 创建新对象C#,oop,c#-4.0,inheritance,Oop,C# 4.0,Inheritance,A类:- 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; }
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,然后我用new关键字
ClassThree obj3=newclassthree()将同一个对象分配给ClassThree代码>。它如何调用classOne.sub()
。这是怎么发生的?我的理解是,它应该调用classThree.Sub() 您没有将Sub
设置为虚拟,因此编译器将使用变量的静态类型来确定要调用的实例。由于obj
的静态类型是classOne
,它将调用classOne.Sub()
,这就是为什么在类2中的Sub
重新声明中必须使用new
关键字的原因。您显式地屏蔽了类1的方法。这里不使用继承或多态。您应该在一个.Sub声明中添加virtual
,在两个.Sub声明中删除new
,并在两个.Sub和三个.Sub声明中添加override
代码>这里我们将新类型引用到obj。在这种情况下,对象类型应该更改吗?为什么没有发生?为什么它仍然在ClassOne中?@Dhinesh-无论您分配给obj
什么,编译器都会根据obj
的静态类型做出方法调用决策。运行时类型仅在调用虚拟方法时使用<代码>添加
是虚拟的,因此编译器将调度到正确的版本Sub
不是虚拟的,因此编译器将始终调用classOne
实例。@Dhinesh-so,如果要调用被重写的Sub
版本,请在基类中将其设为虚拟的。为什么你要编写<代码>添加<代码>虚拟,而不是<代码>子< /代码>?@肖恩认为,如果两者都<代码> ClassOne < /代码>和<代码> CLSSTWOW/<代码>是空的,但是<代码> CLSSTWOW/<代码>是从<代码> ClassOne < /C> >继承的。在这种情况下,首先使用ClassOne
初始化一个对象,然后使用ClassTwo
通过new
关键字初始化同一个对象。现在根据new
关键字,我们为ClassOne
对象分配了新的引用,那么为什么该对象的类型仍然保持为ClassOne
不变?