我正在尝试做类似的事情,但我在遇到错误的过程中遵循以下原则:
无法从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
}
}
重载在编译时已解决,因此您不能期望它根据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();
}
}