Versionskontrolle (override und new)

In diesem Lernprogramm wird die Versionskontrolle in C# mit Hilfe der Schlüsselwörter override und new erläutert. Durch die Versionskontrolle wird sichergestellt, dass die Kompatibilität zwischen Basisklassen und abgeleiteten Klassen auch bei ihrer Weiterentwicklung erhalten bleibt.

Die C#-Programmiersprache ist so ausgelegt, dass die Versionen von Basis- und abgeleiteten Klassen in unterschiedlichen Bibliotheken weiterentwickelt werden können, während die Abwärtskompatibilität erhalten bleibt. Daher führt z.B. die Einführung eines neuen Members in einer Basisklasse, der denselben Namen wie ein Member in einer abgeleiteten Klasse hat, nicht zu einem Fehler. Dies bedeutet auch, dass in einer Klasse explizit angegeben werden muss, ob eine Methode eine geerbte Methode überschreiben soll oder ob es sich lediglich um eine neue Methode handelt, hinter der sich einfach nur eine geerbte Methode mit ähnlichem Namen verbirgt.

Methoden sind in C# standardmäßig nicht virtuell. Um eine Methode als virtuelle Methode zu deklarieren, muss der virtual-Modifizierer in der Methodendeklaration der Basisklasse verwendet werden. Anschließend kann die virtuelle Basismethode von der abgeleiteten Klasse überschrieben werden. Dies geschieht entweder durch die Verwendung des override-Schlüsselworts, oder indem die virtuelle Methode in der Basisklasse durch das new-Schlüsselwort verborgen wird. Wenn weder das override-Schlüsselwort noch das new-Schlüsselwort angegeben wird, gibt der Compiler eine Warnung aus, und die Methode in der Basisklasse wird von der Methode in der abgeleiteten Klasse verborgen. Das folgende Beispiel verdeutlicht diese Konzepte in der Praxis.

Beispiel

// versioning.cs
// CS0114 expected
public class MyBase 
{
   public virtual string Meth1() 
   {
      return "MyBase-Meth1";
   }
   public virtual string Meth2() 
   {
      return "MyBase-Meth2";
   }
   public virtual string Meth3() 
   {
      return "MyBase-Meth3";
   }
}

class MyDerived : MyBase 
{
   // Overrides the virtual method Meth1 using the override keyword:
   public override string Meth1() 
   {
      return "MyDerived-Meth1";
   }
   // Explicitly hide the virtual method Meth2 using the new
   // keyword:
   public new string Meth2() 
   {
      return "MyDerived-Meth2";
   }
   // Because no keyword is specified in the following declaration
   // a warning will be issued to alert the programmer that 
   // the method hides the inherited member MyBase.Meth3():
   public string Meth3() 
   {
      return "MyDerived-Meth3";
   }

   public static void Main() 
   {
      MyDerived mD = new MyDerived();
      MyBase mB = (MyBase) mD;

      System.Console.WriteLine(mB.Meth1());
      System.Console.WriteLine(mB.Meth2());
      System.Console.WriteLine(mB.Meth3());
   }
}

Ausgabe

MyDerived-Meth1
MyBase-Meth2
MyBase-Meth3

Codeerläuterung

Das Verbergen eines Basisklassenmembers aus einer abgeleiteten Klasse stellt in C# keinen Fehler dar. Dieses Feature ermöglicht es Ihnen, Änderungen an der Basisklasse vorzunehmen, ohne andere Bibliotheken zu beeinträchtigen, die diese Basisklasse erben. Angenommen, Sie verfügen zu einem bestimmten Zeitpunkt über folgende Klassen:

class Base {}
class Derived: Base
{
   public void F() {}
}

Einige Zeit später könnte zur Erweiterung der Basisklasse die folgende void-Methode F() hinzugefügt werden:

class Base 
{
   public void F() {}
}
class Derived: Base
{
   public void F() {}
}

Auf diese Weise können sowohl Basis- als auch abgeleitete Klassen in C# problemlos weiterentwickelt werden, während die binäre Kompatibilität erhalten bleibt.



http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/csref/html/vcwlkVersioningTutorial.asp



Aufgabe: .