Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用动态和继承重载_C#_Dynamic_Overloading_Dispatch - Fatal编程技术网

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
创建一个单独的虚拟方法,该方法包含
动态
魔法。然后在class
B
中重复该功能。这样一来,
B
的一个实例将使用
B
中的方法,并在执行重载解析时找到正确的候选对象。

我认为您混淆了单独的机制:

  • 多态性-或运行时调用子类中函数的能力,即使引用是基类类型
  • 重载解析(通常,没有
    动态
    )是最特定匹配函数的编译时解析
当您使用
dynamic
将重载解析延迟到运行时时,您仍然在执行重载解析。
Consume
方法位于
A
中,因此它只会在
A
中查找,甚至不知道
B
是否存在


为了获得您想要的行为,我认为您应该为调用
DoSpecificStuff
创建一个单独的虚拟方法,该方法包含
动态
魔法。然后在class
B
中重复该功能。这样一来,
B
的实例将使用
B
中的方法,并在执行重载解析时找到正确的候选对象。

因此,即使编译器会因为dynamic关键字而等待在运行时解析重载,但它确实记得它应该只在A内部查找?是的,我认为是这样,因为方法是在
A
中定义的,重载解析与多态性和
virtual/override
方法是分开的。因此,尽管编译器会因为dynamic关键字而等到运行时才解析重载,但它确实记得它应该只查看A内部?是的,我认为是这样,因为该方法是在
A
中定义的,并且重载解析与多态性和
virtual/override
方法是分开的。