Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Funktion überladen (https://www.delphipraxis.net/75195-funktion-ueberladen.html)

Pseudemys Nelsoni 15. Aug 2006 18:29


Funktion überladen
 
Moin,

wieso geht das hier nicht:

Code:
     public User MaskExists(string Mask)
        {
            for (int i = 0; i <= users.Count - 1; i++)
            {
                Regex regex = new Regex(((User)users[i]).Mask);

                if (regex.IsMatch(Mask))
                    return (User)users[i];
            }

            return null;
        }

        public bool MaskExists(string Mask)
        {
            return MaskExists(Mask) != null;
        }
Der Compiler meldet:

Zitat:

Fehler 1 Der Typ "Bot.AccessList" definiert bereits einen Member namens "MaskExists" mit den gleichen Parametertypen. C:\Dokumente und Einstellungen\silent\Desktop\Bot\Bot\AccessList.cs 37 21 Bot
Wieos kann ich hier nicht überladen? Die Rückgabetypen unterscheiden sich doch. Soweit ich weiss ging das problemlos in Delphi...

Wie kann ich das machen?

mkinzler 15. Aug 2006 18:32

Re: Funktion überladen
 
In Delphi müßtest du dem Compiler aber auch mit overload anweisen das zu tun.

Pseudemys Nelsoni 15. Aug 2006 18:33

Re: Funktion überladen
 
in C# muss man das aber ja nicht, wie kann ich das hier tun?

Der_Unwissende 15. Aug 2006 18:35

Re: Funktion überladen
 
Das was du möchtest geht nicht!
Überladen heißt gleicher Name unterschiedliche Signatur!

Du nennst zwei Methoden gleich, die nur einen String bekommen, der Compiler weiß nicht welchen Typ du zurück möchtest (es könnten ja auch kompatible Typen sein). Wenn du einmal Integer und einmal STring als Argumente hättest, dann klappt's auch mit dem Überladen!

Gruß Der Unwissende

mkinzler 15. Aug 2006 18:36

Re: Funktion überladen
 
In deinem fall sieht es aber auch, als ob du 2 signatur-gleiche Methoden in einer Klasse hättest. Woher soll dann der Compiler wissen, welche er nehmen soll.

omata 15. Aug 2006 18:38

Re: Funktion überladen
 
In dem Fall bietet sich ein Record als Rückgabewert an.

MeineFunktion().AsInteger
MeineFunktion().AsString

Gruss
Thorsten

Pseudemys Nelsoni 15. Aug 2006 18:39

Re: Funktion überladen
 
Also soweit ich weiss, ging das in Delphi. Der Rückgabewert unterscheidet sich doch hm.... Wenn ich das Ergebnis einer Funktion einem string zuweise, müsste der compiler ja wissen, dass ich die meine mit String als Rückgabewert.

Pseudemys Nelsoni 15. Aug 2006 18:39

Re: Funktion überladen
 
Danke omata, bleibt wohl sonst nichts ;)

pszopp 15. Aug 2006 18:42

Re: Funktion überladen
 
Hi,

in solchen Fällen kann man das Problem mit einer Dummy-Variablen umgehen :

Code:
public User MaskExists(string Mask)
{
    for (int i = 0; i <= users.Count - 1; i++)
    {
        Regex regex = new Regex(((User)users[i]).Mask);
        if (regex.IsMatch(Mask))
            return (User)users[i];
    }
    return null;
}

public bool MaskExists(string Mask, int dummy)
{
    return MaskExists(Mask) != null;
}
Dadurch unterscheiden sich die Parameter der beiden Methode.
Den Dummy-Int kann man dann einfach ignorieren.

Gruß,
pszopp

Jürgen Thomas 15. Aug 2006 18:45

Re: Funktion überladen
 
Zitat:

Zitat von Pseudemys Nelsoni
Also soweit ich weiss, ging das in Delphi. Der Rückgabewert unterscheidet sich doch hm.... Wenn ich das Ergebnis einer Funktion einem string zuweise, müsste der compiler ja wissen, dass ich die meine mit String als Rückgabewert.

Relevant ist ausschließlich und unbedingt die Liste der Argumente/Parameter: diese müssen sich unterscheiden!!! Der Rückgabewert ist dabei unwichtig.
Zitat:

Zitat von NET SDK-Dokumentation
C#-Programmiersprachenspezifikation
7.4.2 Überladungsauflösung
Überladungsauflösungen sind Kompilierungsmechanismen, mit denen die am besten geeigneten Funktionsmember ausgewählt und eine gegebene Argumentliste aufgerufen sowie eine Gruppe potenzieller Funktionsmember festgelegt werden.

Jürgen

Khabarakh 15. Aug 2006 19:14

Re: Funktion überladen
 
Zitat:

Zitat von Pseudemys Nelsoni
Danke omata, bleibt wohl sonst nichts ;)

Es gibt (zumindest in diesem Fall) eine viel einfachere Möglichkeit: Die zweite Methode ganz entfernen, da sie so unnötig wie ein Kropf ist ;) .

Übrigens ist es unter .Net grundsätzlich möglich, überladene Methoden mit gleicher Signatur aber unterschiedlichem Rückgabewert zu deklarieren. Allerdings kenne ich keine Sprache außer CIL selbst, die dieses Feature unterstützt.

Der_Unwissende 15. Aug 2006 19:21

Re: Funktion überladen
 
Zitat:

Zitat von Pseudemys Nelsoni
Also soweit ich weiss, ging das in Delphi. Der Rückgabewert unterscheidet sich doch hm.... Wenn ich das Ergebnis einer Funktion einem string zuweise, müsste der compiler ja wissen, dass ich die meine mit String als Rückgabewert.

Da siehst du ein wenig was Falsch! Das ging auch unter Delphi nicht und sollte unter keiner anderen Sprache funktionieren. Stell dir einfach mal vor du hast eine Abstrakte Klasse AK und zwei Klassen A und B die von dieser Klasse Erben.
Jetzt überlädst du eine Methode, so grob in der Art:
Delphi-Quellcode:
function doFoo(s : String) : A;
begin
...
end;

function doFoo(s : String) : B;
begin
...
end;

procedure main;
var ak : AK;
begin
  ak := doFoo('Egal'); //<- Hier kann der Compiler nicht sagen welche Methode du möchtest
end;
Natürlich geht das noch in anderen Kombinationen, jedenfalls läufst du hier ganz schnell Gefahr einen Fehler zu übersehen und die falsche Methode aufzurufen, da sollte es jeder Compiler (jede Sprache) verbieten so etwas zuzulassen!

[ANMERKUNG NACH ROTEM KASTEN]
Ich möchte nochmal betonen, dass es keine Rechtfertigung gibt dies in einer Sprache zuzulassen, vollkommen unnötig!
[/ANMERKUNG NACH ROTEM KASTEN]

Oxmyx 15. Aug 2006 20:59

Re: Funktion überladen
 
Zitat:

Zitat von Pseudemys Nelsoni
Also soweit ich weiss, ging das in Delphi. Der Rückgabewert unterscheidet sich doch hm.... Wenn ich das Ergebnis einer Funktion einem string zuweise, müsste der compiler ja wissen, dass ich die meine mit String als Rückgabewert.

Niemand zwingt mich, den Rückgabewert einer Funktion einer Variablen zuzuweisen. Was dann?

Khabarakh 15. Aug 2006 22:22

Re: Funktion überladen
 
Zitat:

Zitat von Der_Unwissende
[ANMERKUNG NACH ROTEM KASTEN]
Ich möchte nochmal betonen, dass es keine Rechtfertigung gibt dies in einer Sprache zuzulassen, vollkommen unnötig!
[/ANMERKUNG NACH ROTEM KASTEN]

In IL zu schreiben, _ist_ (so gut wie immer) unnötig :zwinker: . Zudem ist CIL insofern eine besondere Sprache, dass sie einfach nur die menschenlesbare Form des Inhaltes einer jeden .Net-Assembly, des IL-Bytecodes, ist. Der IL-"Compiler" hat überhaupt keine Entscheidungsfähigkeit über sinnvoll und nicht sinnvoll, da er einfach nur ein Übersetzer ist. Diese Entscheidung liegt bei den Compiler-Herstellern, und bei deren Produkten habe ich wie gesagt noch nie eine Verwendung dieser Eigenschaft der Common Language Runtime gesehen.

Code:
.method static void Main(string[] args)
   {
      .entrypoint
      .maxstack 1
      call int32 GimmeFive()
      call void [mscorlib]System.Console::WriteLine(int32)
      ret
   }
   
   .method static int32 GimmeFive()
   {
      .maxstack 1
      ldc.i4.5
      ret
   }
   
   .method static string GimmeFive()
   {
      .maxstack 1
      ldstr "Five"
      ret
   }


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz