在早期和晚期绑定中实际发生了什么

时间:2013-09-18 04:39:04

标签: c# oop

我在Main()中创建了两个Manager类对象,如下所示:

Manager mgr = new Manager();
Employee emp= new Manager();

我理论上理解的是,第一个对象创建[mgr]是编译时绑定,而第二个对象创建[emp]是运行时绑定。但是我想了解实际上实际发生的事情,决定函数调用将在编译时绑定到函数名[在我的情况下,mgr]或运行时间[在我的情况下,emp]。

我在这里理解的是,在这两种情况下,对象只能在运行时创建。如果我说新的Manager()那么它必须只创建Manager的对象。因此,请建议在运行时实际发生的情况与编译时不同。

namespace EarlyNLateBinding
{
    class Employee
    {        
        public virtual double CalculateSalary(double basic, double hra, double da)
        {
            return basic + hra + da;
        }
    }

    class Manager:Employee
    {
        double allowances = 4000;
        public override double CalculateSalary(double basic, double hra, double da)
        {
            return basic + hra + da+allowances;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Employee emp= new Manager();
            double empsalary = emp.CalculateSalary(35000, 27000, 5000);
            Console.WriteLine(empsalary.ToString());

            Manager mgr = new Manager();
            double mgrsalary = mgr.CalculateSalary(35000, 27000, 5000);
            Console.WriteLine(mgrsalary.ToString());
            Console.Read();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这两种情况都是早期绑定的例子,因为它在编译时是100%确定性的,如何实例化对象。这里没有动态行为。当在编译时无法确定如何实例化对象时,会发生延迟绑定。一个典型的例子就是反思。