Lektion 83:Die Klasse FileDictionaryMit dem nötigen Wissen über Dateien ausgerüstet, kann jetzt das Telefonbuchprogramm sogar erweitert werden, daß die Daten auf der Festplatte gespeichert werden. Dazu wird einfach die bisherige Klasse Dictionary genommen und ein wenig erweitert. Die neue Klasse soll FileDictionary heißen.
Jetzt muß noch gesagt werden, daß die Klasse FileDictionary<KEY,VALUE,KEY_COMPARATOR> eine spezielle Art von Dictionary<KEY,VALUE,KEY_COMPARATOR> ist.
Durch diese Schreibweise wird gesagt, daß die Klasse Dictionary<KEY,VALUE,KEY_COMPARATOR> von der Klasse FileDictionary<KEY,VALUE,KEY_COMPARATOR> erbt. Ich lasse im folgenden die Template-Argumente weg und sprechen nur noch von Dictionary und FileDictionary. Bei dieser Vererbung heißt Dictionary die Basisklasse (Oberklasse) und FileDictionary die abgeleitete Klasse (Unterklasse). Der Compiler sorgt dafür, daß überall, wo die Basisklasse verwendet werden kann, auch die abgeleitete Klasse verwendet werden kann. Testen Sie das, indem sie im Telefonbuchprogramm statt
jetzt die abgeleitete Klasse verwenden.
Genau so soll jetzt für die Klasse FileDictionary vorgegangen werden: "Ein FileDictionary ist ein Dictionary, das zusätzlich noch die Methoden load und save kann". Bisher wurde nur gesagt: "Ein FileDictionary ist ein Dictionary". class Base:public Derived bedeutet: "Ein Base ist ein Derived". Um zusätzliche Eigenschaften in die Klasse FileDictionary einzubauen, werden sie wie gewohnt eingetragen:
Es ergibt sich folgende Fehlermeldung: ==> 'm_data' : cannot access private member declared in class 'Dictionary Das ist auch richtig so. Das Attribut m_date ist in der Klasse Dictionary als private deklariert worden. Das heißt, daß nur von Methoden innerhalb der Klasse Dictionary auf dieses Attribut zugegriffen werden kann. Jetzt soll die Unterklasse FileDictionary aber auch darauf zugreifen können. Aber dazu soll m_data nicht einfach public gemacht werden, denn dann könnte einfach jeder darauf zugreifen, was bestimmt zu schwer zu finden den Fehlern führen würde. Natürlich gibt es auch dafür einen Ausweg. Neben den Zugriffsspezifizierern private und public gibt es noch protected. Das Wort protected sagt aus, daß die folgenden Deklarationen für Unterklassen zugreifbar sind, für alles andere wirkt protected wie private. Das ist genau das, was hier gebraucht wird. Das Attribut m_data in der Klasse Dictionary wird protected gemacht. Ich teste die neue Klasse mit folgender Funktion:
Die erstellte Datei "telefonbuch.txt" bekommt den Inhalt Volkard0177-8511255Wolfram06151-319616 Das ist nicht erwünscht. Es ist nämlich hier nicht mehr möglich, die einzelnen Sätze voneinander zu trennen. Das kann aber leicht behoben werden, indem jeder string in eine eigene Zeile kommt. Außerdem wäre es für das Einlesen ganz praktisch, wenn man vorher wüßte, wie viele Datensätze in der Datei liegen. Dazu wird einfach vor dem Speichern der einzelnen Datensätze die Anzahl der Sätze in die Datei geschrieben.
ÜbungSchreiben Sie die entsprechende load-Methode, die die soeben geschriebenen Daten wieder einlesen kann. Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern. [aktuelle Version] [inhalt] [index] [Fehlerkorrektur, Verbesserungsvorschlag] © Volkard Henkel <volkard@normannia.de>, last update: 08/25/00 |