Freigeben über


Überladen von Membern

Aktualisiert: November 2007

Die Signatur eines Members umfasst den Namen und die Parameterliste des Members. Jede Membersignatur muss für den Typ eindeutig sein. Member können über den gleichen Namen verfügen, solange sich ihre Parameterlisten unterscheiden. Wenn es sich bei zwei oder mehr Membern eines Typs um Member derselben Art (Methode, Eigenschaft, Konstruktor usw.) handelt und diese denselben Namen, jedoch unterschiedliche Parameterlisten aufweisen, werden die Member als überladen bezeichnet. Beispielsweise enthält die Array-Klasse zwei CopyTo-Methoden. Die erste Methode akzeptiert ein Array und einen Int32-Wert, und die zweite Methode akzeptiert ein Array und einen Int64-Wert.

Tipp

Durch das Ändern des Rückgabetyps einer Methode wird die Methode entsprechend der Common Language Runtime-Spezifikation nicht eindeutig. Sie können keine Überladungen definieren, die sich nur durch den Rückgabetyp unterscheiden.

Überladene Member müssen Varianten der gleichen Funktionalität bereitstellen. Beispielsweise sollte ein Typ nicht über zwei CopyTo-Member verfügen, wobei der erste Member Daten in ein Array und der zweite Member Daten in eine Datei kopiert. Im Allgemeinen werden mit Memberüberladung Überladungen bereitgestellt, die wenige oder keine Parameter akzeptieren und benutzerfreundlich sind. Diese Member rufen Überladungen auf, die leistungsstärker sind, deren ordnungsgemäße Verwendung jedoch mehr Erfahrung erfordert. Die benutzerfreundlichen Überladungen unterstützen allgemeine Szenarien, indem sie Standardwerte an die komplexen Überladungen übergeben. Beispielsweise stellt die File-Klasse Überladungen für die Open-Methode bereit. Die einfache Überladung Open akzeptiert einen Dateipfad und einen Dateimodus. Sie ruft die Open-Überladung auf, die Pfad-, Dateimodus-, Dateizugriff- und Dateifreigabeparameter akzeptiert und häufig verwendete Standardwerte für Dateizugriffs- und Dateifreigabeparameter bereitstellt. Entwickler, die die Flexibilität der komplexen Überladung nicht benötigen, müssen keine Kenntnisse über Dateizugriffs- und Dateifreigabemodelle besitzen, um eine Datei öffnen zu können.

Für die einfache Verwaltung und Versionserstellung sollten die einfacheren Überladungen die komplexen Überladungen zum Ausführen ihrer Aktionen verwenden. Die zugrunde liegende Funktionalität sollte nicht an mehreren Stellen implementiert werden.

Richtlinien zum Überladen

Anhand der folgenden Richtlinien können Sie einen guten Entwurf der überladenen Member sicherstellen.

Verwenden Sie nach Möglichkeit beschreibende Parameternamen, um den von einfacheren Überladungen verwendeten Standardwert anzugeben.

Diese Richtlinie trifft am meisten auf Boolean-Parameter zu. Der Parametername der komplexeren Überladung sollte den von der einfacheren Überladung bereitgestellten Standardwert angeben, indem der entgegengesetzte Zustand bzw. die entgegengesetzte Aktion beschrieben wird. Beispielsweise stellt die String-Klasse die folgenden Überladungen bereit:

Overloads Public Shared Function Compare( _
   ByVal strA As String, _
   ByVal strB As String _
) As Integer

Overloads Public Shared Function Compare( _
   ByVal strA As String, _
   ByVal strB As String, _
   ByVal ignoreCase As Boolean _
) As Integer
public static int Compare(
   string strA,
   string strB
);

public static int Compare(
   string strA,
   string strB,
   bool ignoreCase
);

Die zweite Überladung stellt den Boolean-Parameter mit dem Namen ignoreCase bereit. Dies bedeutet, dass in der einfacheren Überladung die Groß-/Kleinschreibung beachtet wird und Sie die komplexere Überladung nur verwenden müssen, wenn die Groß-/Kleinschreibung ignoriert werden soll. Im Allgemeinen sollte der Standardwert false sein.

Vermeiden Sie ein willkürliches Variieren von Parameternamen in Überladungen. Wenn ein Parameter in einer Überladung dieselbe Eingabe wie ein Parameter in einer anderen Überladung darstellt, müssen die Parameter denselben Namen aufweisen.

Vermeiden Sie z. B. Folgendes:

Public Sub Write(message as String, stream as FileStream)
End Sub
Public Sub Write(line as String, file as FileStream, closeStream as Boolean)
End Sub
public void Write(string message, FileStream stream){}
public void Write(string line, FileStream file, bool closeStream){}

Die richtige Definition für diese Überladungen lautet wie folgt:

Public Sub Write(message as String, stream as FileStream)
End Sub
Public Sub Write(message as String, stream as FileStream, _
    closeStream as Boolean)
End Sub
public void Write(string message, FileStream stream){}
public void Write(string message, FileStream stream, bool closeStream){}

Ordnen Sie die Parameter in überladenen Membern in der gleichen Reihenfolge an. Parameter mit demselben Namen sollten in allen Überladungen an der gleichen Position angeordnet sein.

Vermeiden Sie z. B. Folgendes:

Public Sub Write( message as String, stream as FileStream)
End Sub
Public Sub Write(stream as FileStream, message as String, _
    closeStream as Boolean)
End Sub
public void Write(string message, FileStream stream){}
public void Write(FileStream stream,  string message, bool closeStream){}

Die richtige Definition für diese Überladungen lautet wie folgt:

Public Sub Write(message as String, stream as FileStream)
End Sub
Public Sub Write(message as String, stream as FileStream, _
    closeStream as Boolean)
End Sub
public void Write(string message, FileStream stream){}
public void Write(string message, FileStream stream, bool closeStream){}

Diese Richtlinie weist zwei Einschränkungen auf:

  • Wenn eine Überladung eine Variablenargumentliste akzeptiert, muss die Liste der letzte Parameter sein.

  • Wenn die Überladung out-Parameter akzeptiert, müssen diese konventionsgemäß als letzte Parameter angegeben werden.

Legen Sie nur die längste Überladung als virtual (Overridable in Visual Basic) fest, wenn Erweiterbarkeit erforderlich ist. Kürzere Überladungen sollten einfach über eine längere Überladung aufgerufen werden.

Diese Vorgehensweise wird im folgenden Codebeispiel veranschaulicht.

Public Sub Write(message as String, stream as FileStream)
    Me.Write(message, stream, false)
End Sub

Public Overridable Sub Write( _
    message as String, stream as FileStream, closeStream as Boolean)
    ' Do work here.
End Sub
public void Write(string message, FileStream stream)
{
    this.Write(message, stream, false);
}
public virtual void Write(string message, FileStream stream, bool closeStream)
{
    // Do work here.
}

Verwenden Sie zum Überladen von Membern keinen ref-Modifizierer oder out-Modifizierer.

Vermeiden Sie z. B. Folgendes.

Public Sub Write(message as String,  count as Integer)


...


Public Sub Write(message as String, ByRef count as Integer)
public void Write(string message, int count)


...


public void Write(string message, out int count)

Wenn dies in einem Entwurf auftritt, liegt im Allgemeinen mit hoher Wahrscheinlichkeit ein größeres Entwurfsproblem vor. Sie können einen der Member umbenennen, um umfassendere Informationen über die genaue Aktion anzugeben, die von der Methode ausgeführt wird.

Lassen Sie die Übergabe von NULL (Nothing in Visual Basic) für optionale Argumente zu. Wenn eine Methode optionale Argumente akzeptiert, die Verweistypen sind, lassen Sie die Übergabe von NULL zu, um anzugeben, dass der Standardwert verwendet werden soll. Hierdurch wird vermieden, dass vor dem Aufruf eines Members eine Überprüfung auf NULL erfolgen muss.

Im folgenden Beispiel sollten Entwickler keine Überprüfung auf null durchführen müssen.

Public Sub CopyFile (source as FileInfo, _
    destination as DirectoryInfo, _
    newName as string)

    If newName Is Nothing
        InternalCopyFile(source, destination) 
    Else
        InternalCopyFile(source, destination, newName)
    End If
End Sub
public void CopyFile (FileInfo source, DirectoryInfo destination, string newName)
{
    if (newName == null)
    {
        InternalCopyFile(source, destination);
    }
    else
    {
        InternalCopyFile(source, destination, newName);
    }
}

Verwenden Sie Memberüberladungen, anstatt Member mit Standardargumenten zu definieren. Standardargumente sind nicht CLS-kompatibel und können in einigen Sprachen nicht verwendet werden.

Im folgenden Codebeispiel wird ein falscher Methodenentwurf veranschaulicht.

Public Sub Rotate (data as Matrix, Optional degrees as Integer = 180)
' Do rotation here
End Sub

Dieser Code sollte in zwei Überladungen geändert werden, wobei die einfachere Überladung den Standardwert bereitstellt. Im folgenden Codebeispiel wird der richtige Entwurf veranschaulicht.

Overloads Public Sub Rotate (data as Matrix)
    Rotate(data, 180)
End Sub

Overloads Public Sub Rotate (data as Matrix, degrees as Integer)
' Do rotation here
End Sub

Copyright für einzelne Teile 2005 Microsoft Corporation. Alle Rechte vorbehalten.

Copyright für einzelne Teile Addison-Wesley Corporation. Alle Rechte vorbehalten.

Weitere Informationen zu Entwurfsrichtlinien finden Sie im Buch "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries" von Krzysztof Cwalina und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.

Siehe auch

Weitere Ressourcen

Entwurfsrichtlinien für Member

Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken