Sinn von sealed



  • Kann mir mal einer den Sinn von sealed erklären? Soweit ich weis verhindert man damit das man von einer Klasse ableiten kann, aber wozu brauch man das? Ist doch nur hinderlich wenn einem dann irgendwann einfällt das man doch irgendwas von der klasse ableiten muss. Oder verpeil ich jetzt irgendwas total?



  • Ich versuche es mit einem Beispiel:

    abstract class InternetProgramm {
        public void machDeineArbeit() {
            stelleVerbindungHer();
            kommuniziere();
        }    
    
        protected abstract void stelleVerbindungHer();
        protected abstract void kommuniziere();
    }
    
    abstract class RssReader : InternetProgramm { ... }
    
    abstract class EMailProgramm : InternetProgramm {
        protected sealed override stelleVerbindungHer() { ... }
    }
    
    class Thunderbird : EMailProgramm {
        protected override kommuniziere() { ... }
    }
    

    Die Arbeit eines jeden Internetprogramms besteht darin, eine Verbindung herzustellen und mit dem Server zu kommunizieren. Die Kommunikation kann sich dabei sogar noch innerhalb der e-Mail Programme unterscheiden, der eine löscht die Nachrichten auf dem Server, der andere lädt sie nur herunter, etc.
    Aber eines ist bei allen e-Mail Programmen gleich: Die Art, wie die Verbindung hergestellt wird. Denn alle e-Mail Programme benutzen das POP3-Protokoll (wenn's doch nur so wäre). Die Klasse EMailProgramm macht vielleicht noch mehr mit der Verbindung, als sie nur herzustellen und sie verlässt sich dabei darauf, dass immer nach ihren Gutdünken die Verbindung zustande kommt. Die Klasse EMailProgramm ist also auf ein bestimmtes Verhalten angewiesen, daher wurde es fixiert.

    Bei Klassen ist es schwieriger. Wenn Programmteile auf das Verhalten einer Klasse angewiesen sind, kann es sinnvoll sein, Redefinitionen zu verbieten. Vererbung bedeutet nicht nur "ist ein", sondern auch "verhält sich wie ein". Das kann man manchmal so sicherstellen.


Anmelden zum Antworten