我有以下课程:
class Polygon
{
protected string name;
protected float width, height;
public Polygon(string theName, float theWidth, float theHeight)
{
name = theName;
width = theWidth;
height = theHeight;
}
public virtual float calArea()
{
return 0;
}
}
class Rectangle : Polygon
{
public Rectangle(String name, float width, float height) : base(name,width,height)
{
}
public override float calArea()
{
return width * height;
}
}
主要功能1:
static void Main(string[] args)
{
Rectangle rect1 = new Rectangle("Rect1", 3.0f, 4.0f);
float Area = rect1.calArea()
}
主要功能2:
static void Main(string[] args)
{
Polygon poly = new Rectangle("Rect1", 3.0f, 4.0f);
float Area = poly.calArea()
}
据我所知,主功能2使用动态绑定 如果我在Rectangle类的calArea方法中将override关键字更改为new,那么它是静态绑定。 主要功能1怎么样?它是否使用静态/动态绑定?
答案 0 :(得分:1)
我不认为'动态'绑定对此是正确的。您正在谈论编译时(静态)和运行时绑定。如果没有从Rectangle继承类 - 那么在示例1中,有足够的信息供编译器决定调用哪个方法,并且它可以进行编译时(静态)绑定。
<强> [编辑]:强>
显然我不对。 我检查了示例1生成的IL代码,示例2使用'new'代替'override',主函数的代码看起来是相同的:
IL_000f: newobj instance void Console.Program/Rectangle::.ctor(string,
float32,
float32)
IL_0014: stloc.0
IL_0015: ldloc.0
IL_0016: callvirt instance float32 Console.Program/Polygon::calArea()
从这段代码中我们可以看到,即使是例1,也可以从Polygon类调用callArea方法。因此,在编译IL代码的阶段,没有绑定到精确的方法实现。
答案 1 :(得分:0)
非虚方法是静态绑定,这意味着它在编译时已知要调用哪个方法。通过提供新关键字,您告诉编译器这是虚拟/覆盖区域。
主要功能1没有定义新关键字,AFAIK将使用动态绑定,因为它仍然在虚拟覆盖的范围内。