2013-03-18 2 views
-1

У меня есть эти две функциикак перегрузить два метода с различными входными параметрами

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

Пожалуйста, может кто-нибудь помочь.

Благодаря

+6

Каков ваш вопрос/проблема, с которой вы сталкиваетесь ..? – MethodMan

+2

В названии вы говорите о методах * переопределения *, но ни один из показанных методов не является «виртуальным», поэтому переопределение в этом случае невозможно. –

+0

Мне нужно сначала избежать избыточного кода .. тогда я хочу использовать метод переопределения, чтобы упростить код. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. – user175084

ответ

6

Если я правильно понимаю ваш вопрос, вы имеете в виду, что хотите перегрузить метод, чтобы избежать дублирования кода ... вот как бы я это сделал.

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

Я хотел бы избежать использования объекта как тип для вашего второго параметра, как это кажется неоднозначным в этом случае, используя тип указывает целевое назначение параметра.

+0

Спасибо вам большое, сэр .. именно то, что я хотел .. Приношу извинения за то, что я недостаточно ясен. – user175084

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

Следуя логике кода, представленного, поправьте меня, если я ошибаюсь, единственное различие между этими 2 Митосе является то, что в сначала tempFileName основан на тип имя, во втором вместо этого это просто второй параметр, переданный вызывающим абонентом .

+0

да, вы правы. но я хотел использовать концептуальную концепцию здесь. Можете ли вы предложить что-то на этом .. Большое спасибо – user175084

+0

@ user175084 нечего переопределять, кажется, все в одном классе. То, что вы, вероятно, ищете, - это «полиморфизм», что и есть то, что находится в ответе. –

+1

@ user175084 Вы имеете в виду 'перегрузка', а не' overriding'. –

0

Проблема заключается в том, что строка также является объектом, поэтому компилятор не может выбрать, какой метод использовать. Вы можете изменить порядок параметров или переименовать один из методов.

+1

Разве компилятор не выбрал строку для строки, потому что она лучше подходит? –

+1

Компилятор будет выбирать версию 'string' для строки' string' и 'object' для чего-либо еще. Здесь нет конфликта. –

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

Затем вы можете использовать одну функцию для выполнения двух заданий. Будет ли это делать?

+2

Я бы сделал 'string' из' объекта' внутри вашего 'if', а затем пусть управление будет продолжено. –

0

Вы можете привести значение «Результаты» к объекту:

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"; 
    } 
} 

Второй вызов ПолучитьЗначение получить-х, который поступает на один с объектом парам.

Смежные вопросы