方法重载多态性是否在 C# 中早期绑定?
Is method overloading polymorphism Early Bound in C#?
在 C# 中,如果我有
public class BaseClass
{
//BaseClass implementation
}
public class Derived : BaseClass
{
//Derived implementation
}
public class AnotherClass
{
AnotherClass(BaseClass baseClass)
{
//Some code
}
AnotherClass(Derived derived) : this(derived as BaseClass)
{
//Some more code
}
}
然后做:
BaseClass baseVariable = new Derived();
AnotherClass anotherVariable = new AnotherClass(baseVariable);
这将导致提前绑定,调用 AnotherClass(BaseClass)
方法。
相反,如果我使用 dynamic
关键字对其进行转换 - 或者使用 dynamic 实例化一个变量,然后将其作为构造函数参数传递,将调用 AnotherClass(Derived)
:
BaseClass baseVariable = new Derived();
//This will instantiate it using the AnotherClass(Derived)
AnotherClass anotherVariable = new AnotherClass(baseVariable as dynamic);
方法是否在 C# 中重载早期绑定(在编译时求值)?这意味着,是否有任何其他方法或技巧 来确定对另一个 class 构造函数的 mostly-derived 调用 以应用采用 mostly derived [=] 的构造函数的调用29=] 在不使用 dynamic
或反射的情况下作为参数输入?
C#中的绑定时间取决于绑定是否涉及dynamic
。如您所见,如果您使用 dynamic
,您将获得执行时重载决议;如果不这样做,您将获得编译时重载解决方案。
请注意,即使重载决策涉及动态类型,它仍将使用编译时已知的信息——只有 dynamic
类型的表达式使用执行时类型。例如:
using System;
class Test
{
static void Main()
{
object x = "abc";
dynamic y = 10;
Foo(x, y); // Prints Foo(object,int)
}
static void Foo(object x, int y)
{
Console.WriteLine("Foo(object,int)");
}
static void Foo(string x, int y)
{
Console.WriteLine("Foo(string,int)");
}
}
如果将 x
的声明类型更改为 dynamic
, 则 执行时类型将是相关的(并且它将打印 Foo(string,int)
).
当然,这只是重载决议 - 重写 总是 在执行时确定,除非您使用的是非虚拟调用(要么调用非虚拟方法, 或使用 base.Foo(...)
.
关于这一点:
Is there any other way or trick to determine the mostly-derived call to the other class constructor - apart reflection?
找出存储在引用中的对象的最派生类型的唯一方法是查询它(使用 GetType
或其他)。所以不,反思在这里是不可避免的。
如果您已经知道最派生的类型是什么,您当然可以在传入之前转换为它,以便在编译时选择适当的重载。您也可以在第一个代码段中使用 var
来自动使用派生程度最高的类型作为参考。
在 C# 中,如果我有
public class BaseClass
{
//BaseClass implementation
}
public class Derived : BaseClass
{
//Derived implementation
}
public class AnotherClass
{
AnotherClass(BaseClass baseClass)
{
//Some code
}
AnotherClass(Derived derived) : this(derived as BaseClass)
{
//Some more code
}
}
然后做:
BaseClass baseVariable = new Derived();
AnotherClass anotherVariable = new AnotherClass(baseVariable);
这将导致提前绑定,调用 AnotherClass(BaseClass)
方法。
相反,如果我使用 dynamic
关键字对其进行转换 - 或者使用 dynamic 实例化一个变量,然后将其作为构造函数参数传递,将调用 AnotherClass(Derived)
:
BaseClass baseVariable = new Derived();
//This will instantiate it using the AnotherClass(Derived)
AnotherClass anotherVariable = new AnotherClass(baseVariable as dynamic);
方法是否在 C# 中重载早期绑定(在编译时求值)?这意味着,是否有任何其他方法或技巧 来确定对另一个 class 构造函数的 mostly-derived 调用 以应用采用 mostly derived [=] 的构造函数的调用29=] 在不使用 dynamic
或反射的情况下作为参数输入?
C#中的绑定时间取决于绑定是否涉及dynamic
。如您所见,如果您使用 dynamic
,您将获得执行时重载决议;如果不这样做,您将获得编译时重载解决方案。
请注意,即使重载决策涉及动态类型,它仍将使用编译时已知的信息——只有 dynamic
类型的表达式使用执行时类型。例如:
using System;
class Test
{
static void Main()
{
object x = "abc";
dynamic y = 10;
Foo(x, y); // Prints Foo(object,int)
}
static void Foo(object x, int y)
{
Console.WriteLine("Foo(object,int)");
}
static void Foo(string x, int y)
{
Console.WriteLine("Foo(string,int)");
}
}
如果将 x
的声明类型更改为 dynamic
, 则 执行时类型将是相关的(并且它将打印 Foo(string,int)
).
当然,这只是重载决议 - 重写 总是 在执行时确定,除非您使用的是非虚拟调用(要么调用非虚拟方法, 或使用 base.Foo(...)
.
关于这一点:
Is there any other way or trick to determine the mostly-derived call to the other class constructor - apart reflection?
找出存储在引用中的对象的最派生类型的唯一方法是查询它(使用 GetType
或其他)。所以不,反思在这里是不可避免的。
如果您已经知道最派生的类型是什么,您当然可以在传入之前转换为它,以便在编译时选择适当的重载。您也可以在第一个代码段中使用 var
来自动使用派生程度最高的类型作为参考。