2013-05-23 7 views
7

Ich habe eine Situation, in der ich möchte, dass der Rückgabetyp für eine Methodenüberladung anders ist, aber in C# nicht.C# Overload-Rückgabetyp - empfohlener Ansatz

Was ist der beste Weg, damit umzugehen? Ist die Tatsache, dass ich das brauche, meine Programmstruktur fehlerhaft?

Angesichts der Tatsache, dass dies in C# unmöglich ist, was ist der empfohlene Ansatz?

+0

Was macht die Methode? –

+0

Ruft eine Liste von Daten ab, entweder als LinkedList oder als Dictionary. – richard

+0

Mit dem Aufkommen des 'var'-Schlüsselworts ist es einfach unmöglich, ohne Mehrdeutigkeit zu implementieren. Siehe [function-overloading-by-return-type] (http://stackoverflow.com/questions/442026/function-overloading-by-return-type) – nawfal

Antwort

18

Normalerweise geben Sie den Methoden einfach verschiedene Namen.

Ein Beispiel hierfür ist IDataReader mit GetInt32, GetInt64 usw.

ehrlich zu sein, ich glaube, das es in der Regel macht deutlicher, was Sie ohnehin zu tun versuchen - vor allem, wenn Sie dann Aufruf eine Überladene Methode mit dem Ergebnis:

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

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

Akzeptiert als Antwort, weil die Umbenennung die Antwort klarer macht Ich suchte. – richard

7

Angesichts der Tatsache, dass dies in C# unmöglich ist, was ist der empfohlene Ansatz?

Es hängt davon ab, warum Sie dies benötigen.

Der gebräuchlichste Ansatz besteht darin, nur einen anderen Namen zu verwenden. Das Framework macht dies in vielen Fällen, wie zum Beispiel Convert class.

Wenn Sie mehrere Arten unterstützen möchten, können Sie dies über generische Methoden tun:

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

Die generische Methode Ansatz für repostories üblich ist, wie es üblich ist, dass es eine „Entity“ Art der Basisklasse.

2

Sie können einen anderen Parameter haben, der den Rückgabetyp angibt.

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

Sie brauchen den Parameter 'T type' überhaupt nicht, damit dies funktioniert. Sie brauchen es nicht, da Sie es nicht benutzen;) –

+0

@ReedCopsey Es erlaubt mir: 'string [] s1 = Methode1 (3," a ");' statt 'string [] s2 = Methode1 (3); '. (Keine große Sache. Ich weiß.) – ispiro

+0

@ReedCopsey Ich sehe jetzt, dass Sie eine Antwort dieses Typs haben. Als ich antwortete, habe ich nur den Anfang Ihrer Antwort gesehen, also habe ich das nicht bemerkt. – ispiro

1

Ich habe geschrieben bereits eine Antwort, aber hier ist eine andere Art und Weise: object ‚s verwenden.

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

Und werfen Sie das Ergebnis auf den entsprechenden Typ.

Verwandte Themen