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