当我使用TemplateA类型的参数调用EntryPoint时,我总是收到异常,因为总是调用第一个重载. 我期望发生的是由于动态绑定将调用最具体的方法(第二次重载). 有什么想法吗? private object _obj;
我期望发生的是由于动态绑定将调用最具体的方法(第二次重载).
有什么想法吗?
private object _obj;
public void EntryPoint(object p)
{
myFunc(p);
}
//first overload
private void myFunc(object container)
{
throw new NotImplementedException();
}
//second overload
private void myFunc(TemplateA template)
{
_obj = new ObjTypeA(template);
}
//third overload
private void myFunc(TemplateB template)
{
_obj = new ObjTypeB(template);
}
如果使用动态而不是对象,则可以在C#4.0中执行此操作.如果您想尝试一下,请下载Visual Studio 2010 Beta.在此之前,编译器会根据参数的编译时类型选择要调用的方法.
从您的问题中不清楚您是否了解普通的单调度多态,因为它可以解决您的示例问题.
class TemplateBase
{
public virtual object MyFunc()
{
throw new NotImplementedException();
}
}
class TemplateA : TemplateBase
{
public override object MyFunc()
{
return new ObjTypeA(this);
}
}
class TemplateB : TemplateBase
{
public override object MyFunc()
{
return new ObjTypeB(this);
}
}
其他地方:
private object _obj;
public void EntryPoint(TemplateBase p)
{
_obj = p.MyFunc();
}
当您无法修改TemplateN类时,还有其他选择.最简单的方法是让EntryPoint方法可以访问从Type到某个委托的Dictionary映射.
Dictionary<Type, Func<object, object>> _myFuncs; _myFuncs.Add(typeof(TemplateA), o => new ObjTypeA((TemplateA)o)); _myFuncs.Add(typeof(TemplateB), o => new ObjTypeB((TemplateA)o));
然后,它可以查找委托以执行传递给它的对象类型.
Func<object, object> f = _myFuncs[p.GetType()]; _obj = f(p);
但是,如果要模拟虚函数的确切工作方式,则需要注意继承层次结构.
