C# 使用动态和继承重载
我遇到了一个问题,需要使用继承结构进行动态分派(或者至少我认为应该这样称呼)。更具体地说,我希望使用动态分派,以便可以在继承的类中添加更具体的重载。我找不到与我有相同问题的人(我发现的事情总是在继承类中谈论重写,我需要动态重载)。高度简化的情况如下:C# 使用动态和继承重载,c#,dynamic,overloading,dispatch,C#,Dynamic,Overloading,Dispatch,我遇到了一个问题,需要使用继承结构进行动态分派(或者至少我认为应该这样称呼)。更具体地说,我希望使用动态分派,以便可以在继承的类中添加更具体的重载。我找不到与我有相同问题的人(我发现的事情总是在继承类中谈论重写,我需要动态重载)。高度简化的情况如下: class A { private void DoSpecificStuff(object a); private void DoSpecificStuff(SomeClass a); } class B<T> : A
class A
{
private void DoSpecificStuff(object a);
private void DoSpecificStuff(SomeClass a);
}
class B<T> : A
{
private void DoSpecificStuff(OtherClass<T> a);
}
B b = new B();
b.Consume(new JetAnotherClass());
呼叫站点的工作原理如下:
class A
{
private void DoSpecificStuff(object a);
private void DoSpecificStuff(SomeClass a);
}
class B<T> : A
{
private void DoSpecificStuff(OtherClass<T> a);
}
B b = new B();
b.Consume(new JetAnotherClass());
现在,每当fieldInfo.GetValue(a)找到SomeClass的实例时,就会调用所需的重载函数,并将SomeClass作为形式参数。但是当返回OtherClassT>的实例时,调用的是DoSpecificStuff(对象a),而不是DoSpecificStuff(OtherClassT>a)
为什么我的动态调度在一个类中工作得很好,但在另一个类提供了更多应该动态调度的重载时会中断?动态分派不是从查看最上面的实例开始的吗?它的类型是B
PS:用(虚拟的)受保护的或类似的东西来代替私有的是没有帮助的。事实上,更奇怪的是,使用private确实适用于A中的重载,因为我们使用类型为B的隐式this参数调用DoSpecificStuff,我认为您混淆了不同的机制:
- 多态性-或运行时调用子类中函数的能力,即使引用是基类类型
- 重载解析(通常,没有
)是最特定匹配函数的编译时解析动态
dynamic
将重载解析延迟到运行时时,您仍然在执行重载解析。Consume
方法位于A
中,因此它只会在A
中查找,甚至不知道B
是否存在
为了获得您想要的行为,我认为您应该为调用
DoSpecificStuff
创建一个单独的虚拟方法,该方法包含动态
魔法。然后在classB
中重复该功能。这样一来,B
的一个实例将使用B
中的方法,并在执行重载解析时找到正确的候选对象。我认为您混淆了单独的机制:
- 多态性-或运行时调用子类中函数的能力,即使引用是基类类型
- 重载解析(通常,没有
)是最特定匹配函数的编译时解析动态
dynamic
将重载解析延迟到运行时时,您仍然在执行重载解析。Consume
方法位于A
中,因此它只会在A
中查找,甚至不知道B
是否存在
为了获得您想要的行为,我认为您应该为调用
DoSpecificStuff
创建一个单独的虚拟方法,该方法包含动态
魔法。然后在classB
中重复该功能。这样一来,B
的实例将使用B
中的方法,并在执行重载解析时找到正确的候选对象。因此,即使编译器会因为dynamic关键字而等待在运行时解析重载,但它确实记得它应该只在A内部查找?是的,我认为是这样,因为方法是在A
中定义的,重载解析与多态性和virtual/override
方法是分开的。因此,尽管编译器会因为dynamic关键字而等到运行时才解析重载,但它确实记得它应该只查看A内部?是的,我认为是这样,因为该方法是在A
中定义的,并且重载解析与多态性和virtual/override
方法是分开的。