如何使用不同的输入参数重载两个方法

时间:2013-03-18 14:25:02

标签: c# refactoring override overloading

我有这两个功能

private void calcResults()
{
   MakePath(id, results, _resultCount);
   MakePath(id, "XYZ", _resultSICount)
}

private string MakePath(string subFolder, object obj, int index)
{
    string dir = System.IO.Path.Combine(_outputDir, subFolder);
    string fileName = string.Format("{0} {1} {2}.xml",
           obj.GetType().Name, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
    return System.IO.Path.Combine(dir, fileName);
}

private string MakePath(string subFolder, string tempFileName, int index)
{
    string dir = System.IO.Path.Combine(_outputDir, subFolder);
    string fileName = string.Format("{0} {1} {2}.xml",
           tempFileName, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
    return System.IO.Path.Combine(dir, fileName);
}

请帮助一些人。

由于

5 个答案:

答案 0 :(得分:7)

如果我正确理解你的问题,你的意思是你想重载这个方法以避免代码重复...这就是我的方法。

    private void calcResults()
    {
       MakePath(id, results.GetType(), _resultCount);
       MakePath(id, "XYZ", _resultSICount)
    }

    private string MakePath(string subFolder, Type type, int index)
    {
        return MakePath(subFolder, type.Name, index);
    }

    private string MakePath(string subFolder, string tempFileName, int index)
    {
        string dir = System.IO.Path.Combine(_outputDir, subFolder);
        string fileName = string.Format("{0} {1} {2}.xml",
               tempFileName, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
        return System.IO.Path.Combine(dir, fileName);
    }

我会避免使用object作为第二个参数的类型,因为在这种情况下它似乎不明确,使用Type表示参数的预期用途。

答案 1 :(得分:2)

你可以考虑这样的事情:

    private string MakePath(string subFolder, object obj, int index)
    {        
        //tempFileName here is created beased on the TYPE of the object passed
        string tempFileName = obj.GetType().Name;
        return MakePath(subFolder,tempFileName , index); 

    }

    private string MakePath(string subFolder, string tempFileName, int index)
    {
        //combine directory path
        string dir = System.IO.Path.Combine(_outputDir, subFolder);

        //compute final file name based on the several 
        //parameters and tempFileName parameter
        string fileName = string.Format("{0} {1} {2}.xml",
            tempFileName, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());

        return System.IO.Path.Combine(dir, fileName);
    }

遵循所呈现代码的逻辑,如果我错了,请纠正我,这两种方法之间的唯一区别是,在tempFileName中,类型名称是基于第二个,它只是调用者传递的第二个参数。

答案 2 :(得分:0)

这里的问题是string也是一个对象,因此编译器无法选择使用哪种方法。您可以更改参数顺序,或重命名其中一种方法。

答案 3 :(得分:0)

private string MakePath(string subFolder, object obj, int index)
{
    if(obj.GetType()==typeof(string))
    {
        //copy the strong typed version to here;
        return;
    }
    string dir = System.IO.Path.Combine(_outputDir, subFolder);
    string fileName = string.Format("{0} {1} {2}.xml",
        obj.GetType().Name, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
    return System.IO.Path.Combine(dir, fileName);
}

然后,您可以使用一个功能执行两项工作。这会吗?

答案 4 :(得分:0)

您可以将'results'值转换为对象:

class Program
{
    static void Main(string[] args)
    {

        var ret1 = GetValue("String");
        Console.WriteLine(ret1);
        var ret2 = GetValue((object)"test");
        Console.WriteLine(ret2);

        Console.ReadKey();
    }

    private static object GetValue(string p0)
    {
        return p0;
    }

    private static object GetValue(object p0)
    {
        return "Object";
    }
}

第二次调用GetValue get被路由到具有对象参数的那个。