1)假设:
• B1定义了方法virtualM()和nonvirtualM(),其中前者的方法是虚拟而后者是非虚拟
• B2从导出B1
• B2覆盖virtualM()
• B2内部组件被定义A
•应用程序app不必组件A的参考
在下面的代码应用程序中,app动态加载程序集A,创建类型的实例B2并调用方法virtualM()和nonvirtualM():
Assembly asemb=Assembly.Load(“A”);
Type t= asemb.GetType(“B2”);
B1 a = ( B1 ) Activator.CreateInstance ( “t” );
a.virtualM();
a.nonvirtualM();
Run Code Online (Sandbox Code Playgroud)
a)是否要求a.virtualM()考虑提前约束或延迟约束?
b)我假设a.nonvirtualM()在编译期间解决了一个调用?
2)术语后期绑定是指仅在运行时查找目标方法还是指在运行时创建给定类型的实例?
感谢名单
编辑:
1)
- 我假设在编译期间解析了对a.nonvirtualM()的调用?
- 是的.
如果我们有:
A a = new A();
a.M();
Run Code Online (Sandbox Code Playgroud)
据我所知,在编译时不知道a在运行时将在堆上创建实例(因此在哪个内存地址).现在,通过早期绑定,在编译过程中将函数调用替换为内存地址.但是编译器如何用内存地址替换函数调用,如果它不知道a在运行时将在堆上的哪个对象被创建(这里我假设方法的地址a.M也将在同一个内存位置a)?
2)
方法槽在编译时确定
我假设通过方法槽你指的是V表中的入口点?
a)对a.virtualM()的调用是否被认为是早期绑定或后期绑定?
由谁考虑?
该方法槽是在编译时决定的.插槽的内容 - 实际调用的方法 - 在运行时确定.
因此,绑定可以说是"迟到的".
有些人说在编译时没有完全发生的任何绑定都是后期绑定.有些人说,部分在编译时和部分在运行时发生的虚拟绑定仍然算是"早期",其他人不同意.我想几乎每个人都同意如果插槽在运行时才确定,那肯定是后期绑定.
b)我假设在编译期间解析了对a.nonvirtualM()的调用?
是的.
2)术语后期绑定是指仅在运行时查找目标方法还是指在运行时创建给定类型的实例?
我从来没有听过"后期绑定"指的是创建一个实例.
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |