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.)