什么是早期和后期绑定之间的区别?
Answer 1:
简短的回答是,早期(或静态)结合是指编译时绑定和晚期(或动态)结合是指运行时绑定(例如,当您使用反射)。
Answer 2:
在编译语言,所不同的是鲜明的。
Java的:
//early binding:
public create_a_foo(*args) {
return new Foo(args)
}
my_foo = create_a_foo();
//late binding:
public create_something(Class klass, *args) {
klass.new_instance(args)
}
my_foo = create_something(Foo);
在第一个例子中,编译器在编译时做各种奇妙的东西。 在第二个,你只需要希望,谁使用方法,这样做负责任。 (当然,更新的JVM支持Class<? extends Foo> klass
结构,这样可以大大降低这种风险。)
另一个好处是可以的IDE热链接的类定义,因为它宣布的方法就在这里。 到create_something(美孚)的调用可能与方法的定义很远,如果你正在寻找的方法定义,它可能会很高兴地看到实施。
后期绑定的主要优点是,它使事情变得像反转的控制更容易,以及多态性与鸭打字(如果你的语言支持这样的事情)的某些其他用途。
Answer 3:
直接来自http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm
有使用自动化(或OLE自动化)以编程方式控制其他应用程序有两种方式。
后期绑定使用的CreateObject应用程序对象,然后你就可以控制的创建和实例。 例如,要使用后期绑定创建一个Excel的新实例:
Dim oXL As Object Set oXL = CreateObject("Excel.Application")
在另一方面,操纵Excel的现有实例(如果Excel已经打开)(您是否使用早期或后期绑定不管)你会使用GetObject:
Dim oXL As Object Set oXL = GetObject(, "Excel.Application")
要使用早期绑定,首先需要在你的项目的引用设置为要处理的应用程序。 在任何Office应用程序的VB编辑器中,或在VB本身,您可以通过选择工具+引用,从列表中选择(如“Microsoft Excel 8.0对象库”),你想要的应用程序做到这一点。
要使用早期绑定创建一个Excel的新实例:
Dim oXL As Excel.Application Set oXL = New Excel.Application
无论是哪种情况,顺便说一句,你可以先尝试获得的Excel现有实例,如果返回一个错误,你可以在你的错误处理程序创建一个新的实例。
Answer 4:
从赫伯特·希C ++的书类似,但更详细的解答: -
早期绑定是指发生在编译时的事件。 从本质上说,当调用一个函数所需的所有信息在编译时被称为早期绑定发生。 (换言之,一个对象和一个函数调用编译期间被绑定早期绑定的装置。)的早期绑定包括正常的函数调用(包括标准库函数),重载函数调用和重载操作符的实施例。 主要优点早期绑定的效率。 因为调用函数所需的所有信息是在编译时确定的,这些类型的函数调用是非常快的。
早期绑定相反的是后期绑定。 后期绑定是指功能都没有解决,直到运行时调用。 虚拟函数是用来实现后期绑定。 大家知道,当访问是经由一个基指针或参考,实际上被称为虚拟函数是由对象的类型由所述指针所指向确定。 因为在大多数情况下,这不能在编译时确定,对象和功能没有联系,直到运行时间。 的主要优点后期绑定的灵活性。 不同于早期绑定,后期绑定,您可以创建可不必产生大量的以发生而执行程序的事件做出响应程序“应急代码。” 请记住,因为一个函数调用没有解决,直到运行时,后期绑定可以使稍慢执行时间。 然而今天,速度快的计算机已显著降低与后期绑定的执行时间。
Answer 5:
在解释型语言,不同的是多了几分含蓄。
红宝石:
# early binding:
def create_a_foo(*args)
Foo.new(*args)
end
my_foo = create_a_foo
# late binding:
def create_something(klass, *args)
klass.new(*args)
end
my_foo = create_something(Foo)
由于Ruby是(一般)不编译,没有编译器做漂亮了,前面的东西。 JRuby中的增长意味着更多的Ruby编译这些天,虽然,使得它更像Java中,上面。
与IDE问题依然存在:如果你硬编码他们像Eclipse平台可以查询类的定义,但如果你把它们备份到主叫方没有。
-的控制反转是不是在Ruby中非常流行,可能是因为它的极端运行时的灵活性,但Rails使得大量使用后期绑定,以减少所需的配置量,让您的应用程序去。
Answer 6:
public class child()
{ public void method1()
{ System.out.println("child1");
}
public void method2()
{ System.out.println("child2");
}
}
public class teenager extends child()
{ public void method3()
{ System.out.println("teenager3");
}
}
public class adult extends teenager()
{
public void method1()
{ System.out.println("adult1);
super.method1();
}
}
//In java
public static void main(String []args)
{ ((teenager)var).method1();
}
这将打印出来
adult1
child1
在早期绑定的编译器将所有的儿童和青少年的方法,但在访问后期绑定(在运行时),它会检查在运行时重写方法。
因此,方法1(从子 - 早期绑定)将由方法1成人在运行时(后期绑定),然后将实施从子方法1,因为在青少年中没有方法一方法一覆盖。
请注意,如果孩子没有一个方法1然后在主代码将无法编译。
Answer 7:
编译时多态性也称为超载或者当我们有不同的行为同样的方法名早期绑定或静态绑定。 通过实施同样的方法和不同的行为的多个原型发生在它。 早期绑定是指该计划的第一次编译。 但在后期绑定对象是在程序运行时发生。 也称为动态绑定或重载或运行时多态性。