加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);

但是,如果要模拟虚函数的确切工作方式,则需要注意继承层次结构.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读