2013-05-23 10 views
7

Mam sytuację, w której chcę tylko, aby typ zwracania był inny dla przeciążenia metody, ale nie można tego zrobić w języku C#.C# Przeciążenie typ powrotu - zalecane podejście

Jaki jest najlepszy sposób, aby sobie z tym poradzić? Czy fakt, że tego potrzebuję, oznacza, że ​​moja struktura programu jest wadliwa?

Biorąc pod uwagę fakt, że jest to niemożliwe w języku C#, jakie jest zalecane podejście?

+0

Co robi ta metoda? –

+0

Pobiera listę danych, albo jako LinkedList, albo Dictionary. – richard

+0

Z nadejściem słowa kluczowego 'var', jest to po prostu niemożliwe do zrealizowania bez niejasności. Zobacz [funkcja przeciążania-by-return-type] (http://stackoverflow.com/questions/442026/function-overloading-by-return-type) – nawfal

Odpowiedz

18

Zazwyczaj po prostu podaje się różne nazwy metod.

Przykładem tego jest IDataReader z GetInt32, GetInt64 itp

Szczerze mówiąc, uważam, że to zwykle czyni go bardziej zrozumiałym, co próbujesz zrobić, i tak - zwłaszcza jeśli jesteś wtedy nazywając się metoda przeciążenia z wynikiem:

Console.WriteLine(reader.GetInt32()); // This is clear 

Console.WriteLine(foo.OverloadedGet()); // Which overload of OverloadedGet? 
+1

Zaakceptowana jako odpowiedź, ponieważ fakt, że zmiana nazwy czyni ją bardziej przejrzystą, jest odpowiedzią Szukałem. – richard

7

Biorąc pod uwagę fakt, że jest to niemożliwe w języku C#, jakie jest zalecane podejście?

To zależy od tego, dlaczego jest to potrzebne.

Najbardziej powszechnym podejściem jest użycie innej nazwy. Framework robi to w wielu przypadkach, takich jak Convert class.

Jeśli chcesz obsługiwać wiele typów, można to zrobić za pomocą metod ogólnych:

T SomeMethod<T>() 
    // Optionally add constraints:" 
    where T : IFoo 
{ 

Ogólny podejście metoda jest wspólne dla repostories, jak to jest powszechne, że nie ma „instytucji” typ klasy bazowej.

2

Możesz mieć inny parametr określający typ zwrotu.

public static T[] Method1<T>(int i, T type) 
{ 
    return new T[i]; 
} 
+0

W ogóle nie potrzebujesz parametru 'T type', aby to działało. Nie musisz tego, ponieważ go nie używasz;) –

+0

@ReedCopsey To pozwala mi mieć: 'string [] s1 = Metoda1 (3," a ");' zamiast 'ciąg [] s2 = Metoda1 (3); '. (Nic wielkiego. Wiem.) – ispiro

+0

@ReedCopsey Teraz widzę, że masz odpowiedź tego typu. Kiedy odpowiadałem, właśnie zobaczyłem początek twojej odpowiedzi, więc tego nie zauważyłem. – ispiro

1

Już napisałem odpowiedź, ale tutaj jest inny sposób: użyj object.

object TheMethod(MyEnum type) 
{ 
    if (type == MyEnum.A) return (object)SubMethod1(); 
    else if (type == MyEnum.B) return (object)SubMethod2(); 
    //... 
} 

int SubMethod1() { return 1; } 
string SubMethod2() { return "a"; } 

I rzutuj wynik na odpowiedni typ.

Powiązane problemy