Die zerbrechliche Basisklasse

Problem entsteht (bsp. in Java) durch unwissentliches Überschreiben einer Methode der Basisklasse, (Beispiel nach Mössenböck: C#)

Ausgangssituation (noch harmlos):

namespace Fragile {
    class LibraryClass {
        public void Setup() { ... }
    }
    class MyClass : LibraryClass {
        public void Delete () {
         // lösche gesamte Festplatte
        }
    }
    class Top {
        public static void Main (string [] args) {
            MyClass x = new MyClass();
            x.Setup();
        }
    }
}

dann neue Methode in Basisklasse:

class LibraryClass { ...
  public void Delete () {
    // löscht irgendwas harmloses
  }
  public void Setup() {
    ... this.Delete ();
  }
}

was passiert beim Anwender? (MyClass und Top bleiben.)

So möglich in Java, aber in C# verhindert: wenn in der Basisklasse nicht virtual Delete () steht, dann kann man die Methode gar nicht überschreiben.

(Workaround: in Java wird Annotation @override empfohlen, Werkzeug könnte bei Überschreiben ohne Annotation warnen.)

(Bessere Lösung: es wird überhaupt nichts abgeleitet.)



Johannes Waldmann 2007-06-21