当我使用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);
但是,如果要模拟虚函数的确切工作方式,则需要注意继承层次结构.