c# – 方法重载
发布时间:2020-12-16 01:31:28 所属栏目:百科 来源:网络整理
导读:当我使用TemplateA类型的参数调用EntryPoint时,我总是收到异常,因为总是调用第一个重载. 我期望发生的是由于动态绑定将调用最具体的方法(第二次重载). 有什么想法吗? private object _obj; public void EntryPoint(object p) { myFunc(p); } //first overlo
当我使用TemplateA类型的参数调用EntryPoint时,我总是收到异常,因为总是调用第一个重载.
我期望发生的是由于动态绑定将调用最具体的方法(第二次重载). 有什么想法吗? 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); 但是,如果要模拟虚函数的确切工作方式,则需要注意继承层次结构. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |