Warum kann nicht zwei Methoden mit derselben Signatur deklariert werden, obwohl ihre Rückgabetypen unterschiedlich sind? [Duplikat]

StackOverflow https://stackoverflow.com/questions/584664

  •  06-09-2019
  •  | 
  •  

Frage

Duplizieren : Funktion Überlastung durch Rückgabetyp


Vielleicht ist dies eine sehr dumme Frage, aber ich verstehe nicht, warum ich nicht zwei Methoden erklären kann, die die gleiche Signatur haben, wenn sie unterschiedliche Rückgabetypen haben.

public class MyClass
{
    private double d = 0;

    public double MyMethod()
    {
        return d;
    }

    public string MyMethod()
    {
        return d.ToString();
    }
}

Ich erhalte einen Compiler-Fehler, die besagen, dass die Klasse bereits ein Mitglied mit den gleichen Parametertypen definiert.

(Offensichtlich ist die Art, wie ich dies in meinem Code verwendet habe, ist nicht so einfach wie mein Beispiel-Code ... aber ich denke, es ist die Idee kommt herüber.)

Fehle ich etwas OO-Design über das macht, was ich versuche ein OOP anti-Muster zu tun? Sicherlich der Compiler in der Lage zu bestimmen sollte, welche Methode ich versuche, so lange zu benutzen, wie ich ihm ausdrücklich sagen, welche ich will.

Da MyClass myClass = new MyClass(); würde ich erwarten, dass der folgende Code arbeiten:

double d = myClass.MyMethod();
string s = myClass.MyMethod();

Ich würde erwarten, dass die folgenden Code, Probleme zu haben:

var v = myClass.MyMethod();

Aber auch im Falle von var es in einem Compiler-Fehler zur Folge haben sollte.

Kann jemand sehen, was ich falsch hier? Ich bin mehr als glücklich, korrigiert werden. : -)

War es hilfreich?

Lösung

Es ist wegen der Art Zwang.

Angenommen, Sie haben folgende Funktionen:

int x(double);
float x(double);

double y = x(1.0);

Nun, welche der beiden Prototypen sollten Sie anrufen, vor allem, wenn sie zwei völlig verschiedene Dinge?

Im Grunde wurde eine Entscheidung früh in der Sprache Design nur zu verwenden, um die Funktionsnamen und Argumente zu entscheiden hat, die eigentliche Funktion wird aufgerufen, und wir stecken mit, dass bis ein neuer Standard kommt.

Jetzt haben Sie Ihre Frage C# markiert, aber ich sehe nichts falsch mit einer Sprache entwickeln, die tun können, was Sie vorschlagen. Eine Möglichkeit wäre, zu kennzeichnen als Fehler keine zweideutigen Befehle wie oben und zwingt die Benutzer festlegen, welche aufgerufen werden soll, wie zum Beispiel mit dem Gießen:

int x(double);
float x(double);
double y = (float)(x(1.0));    // overload casting
double y = float:x(1.0);       // or use new syntax (looks nicer, IMNSHO)

Dies könnte damit der Compiler die richtige Version zu wählen. Dies würde auch für einige Probleme umgehen, die anderen Antworten aufgeworfen haben. Sie könnten die mehrdeutige drehen:

System.out.Println(myClass.MyMethod());

in die spezifischen:

System.out.Println(string:myClass.MyMethod());

Dies kann möglich sein, zu erhalten hinzugefügt C#, wenn es nicht zu weit in eine Prozess-Standards (und Microsoft wird hören), aber ich glaube nicht, viel von Ihren Chancen bekommen es hinzugefügt C oder C++ ohne schrecklich große Menge an Anstrengung. Vielleicht wäre einfacher tun es als Erweiterung gcc.

Andere Tipps

Es gibt nichts, von Ihnen zu stoppen aus dem Aufruf der Methode ohne „Einfangen“ den Rückgabetypen. Es ist von nichts, was man zu tun, diese zu stoppen:

myClass.MyMethod();

Wie wird der Compiler wissen, was man in diesem Fall anrufen?

Edit: auf das Hinzufügen, in C # 3.0, wenn Sie var , wie der Compiler wissen, welche Methode Sie aufrufen, wenn Sie dies tun:

var result = myClass.MyMethod();

Da der Rückgabetyp nicht alles ist, was dann wichtig, wenn eine Methode aufgerufen wird. Es wäre in vielen Fällen zu einer Mehrdeutigkeit führen Methoden nur durch Rückgabetyp unterscheiden zu haben. Sie könnten das Ergebnis in einer Variablen überhaupt nicht speichern, oder etwas tun, wie folgt aus:

System.out.Println(myClass.MyMethod());

Der Compiler würde keine Möglichkeit haben, um herauszufinden, welche der Methoden, die Sie anrufen wollen.

Verfahren Signatur ist der Name und die Eingangsparameter (Typ & Reihenfolge) nur. Der Rückgabetyp ist nicht Teil der Signatur. So werden zwei Methoden mit dem gleichen Namen und Eingabeparameter sind identisch und miteinander in Konflikt geraten.

Was, wenn überhaupt, Variable Sie die Methode sind die Zuordnung zu können, die Compiler nicht informieren, welche Methode zu verwenden. Stellen Sie sich vor:

String message = "Ergebnis =" + MeineKlasse.MeineMethode ();

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top