当前位置 : 主页 > 编程语言 > c语言 >

c# – 方法重载

来源:互联网 收集:自由互联 发布时间:2021-06-25
当我使用TemplateA类型的参数调用EntryPoint时,我总是收到异常,因为总是调用第一个重载. 我期望发生的是由于动态绑定将调用最具体的方法(第二次重载). 有什么想法吗? private object _obj;
当我使用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);

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

网友评论