具有继承参数的重载函数

问题描述 投票:0回答:1

我正在尝试做类似的事情,但我在遇到错误的过程中遵循以下原则:

无法从AbstractExampleClass转换为SpecificExampleClassA。

所以我可能会用这段代码朝错误的方向前进,谁能告诉我哪里出了问题以及如何解决。

public abstract class AbstractExampleClass 
{
    // Code goes here
}

public class SpecificExampleClassA : AbstractExampleClass 
{

}

public class SpecificExampleClass : AbstractExampleClass 
{

}

public class handler 
{
    public void Handle(AbstractExampleClass aec)
    {
        HandleSpecific(aec);
    }

    public void HandleSpecific(SpecificExampleClassA a)
    {
        // DoSomething
    }

    public void HandleSpecific(SpecificExampleClassB b)
    {
        // DoSomething Else
    }

}
c# overloading abstract-class
1个回答
1
投票

重载在编译时已解决,因此您不能期望它根据aec运行时类型决定要调用哪个重载。 要调用的重载必须在编译时确定。

[这里您真正需要的是“ subtyping”种多态性(在C#术语中又叫“多态性”,而不是ad hoc polymorphism(又名“超载”)。

改为在子类中移动处理程序方法:

public abstract class AbstractExampleClass 
{
    public abstract void Specific();
}

public class SpecificExampleClassA : AbstractExampleClass 
{

    public override void Specific()
    {
        // DoSomething
    }
}

public class SpecificExampleClass : AbstractExampleClass 
{

    public override void Specific()
    {
        // DoSomething Else
    }
}

public class handler 
{
    public void Handle(AbstractExampleClass aec)
    {
        aec.Specific();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.