Softwaretechnik

Objektorientierte Programmierung mit C

Seite: 2/2

Firmen zum Thema

Umsetzung von Vererbung in C

Bei der Vererbung werden Daten und Funktionen einer Basisklasse in einer abgeleiteten Klasse wiederverwendet und erweitert (Bild 4). In der Programmiersprache C kann tatsächlich auch eine Vererbung realisiert werden. Da der ANSI-Standard die Anordnung der Daten im Speicher regelt, kann durch Aggregation der Basisklasse als erstes Element in der Struktur der abgeleiteten Klasse eine Vererbung erreicht werden.

Listing 4-1, eine Basisklasse:

typedef struct {
   int anzahlRaeder;
   char* hupTon;
   int geschwindigkeit;
   Motor motor;
}Auto;
void Auto_init(Auto *this, int anzahlRaeder, char* hupTon);
void Auto_fahre(Auto *this);
void Auto_hupe(Auto *this, int anzahl);
void Auto_setGeschwindigkeit(Auto *this, int geschwindigkeit);
int Auto_getGeschwindigkeit(Auto *this);

Listing 4-2, eine abgeleitete Klasse:

typedef struct {
   Auto;
   int tragKraft;
}Autokran;
void Autokran_init(Autokran *this, int tragKraft);
void Autokran_init2(Autokran *this, int tragKraft, int anzahlRaeder, char* hupTon);
void Autokran_hebe(Autokran *this, int gewicht);

Listing 4-3, die abgeleitete Klasse kann die Funktionen der Basisklasse benutzen:

void test(void) {
   Autokran kran;
   Autokran_init(&kran, 50);
   Auto_setGeschwindigkeit((Auto*)&kran, 20);
   Auto_hupe((Auto*)&kran, 3);
   Auto_setGeschwindigkeit((Auto*)&kran, 0);
   Autokran_hebe(&kran, 20);
   Autokran_hebe(&kran, 60);
}

Durch das Einfügen der Basisklassendaten als erstes Element in die Struktur werden diese auch als erstes in den Speicher gelegt. Wird dann eine Funktion der Basisklasse aufgerufen, findet diese die ihr bekannten Daten.

Daten vor unberechtigter Manipulation schützen

Bisher wurde die Datenstruktur der Klasse öffentlich im Header abgelegt, und es wurde davon ausgegangen, dass sich jeder Entwickler brav an die Vorschriften hält und auf die Struktur nie direkt, sondern nur über die zugeordneten Funktionen zugreift.

Die Realität kennt aber nicht nur brave Entwickler. Sei es Unwissenheit oder Bequemlichkeit, es wird nicht lange dauern, bis jemand direkt auf die Daten zugreift. Die nächste Fehlersuche wird dann zur Odyssee.

Objektorientierte Programmiersprachen wie C++ bieten zum Schutz der Klassenelemente spezielle Schlüsselwörter an, und der Compiler prüft, ob der Zugriff berechtigt ist. Das gibt es in C leider nicht.

Allerdings kann mit kleinen Änderungen am bisherigen Code trotzdem ein Schutz von internen Daten und Funktionen erreicht werden. Es können nicht alle bekannten Schutzstufen umgesetzt werden, aber zwischen öffentlichen (public) und privaten (private) Klassenelementen kann unterschieden werden. Voraussetzung dafür ist, dass die der Klasse zugrundeliegende Struktur nicht mehr veröffentlicht wird (Bild 5).

Bildergalerie
Bildergalerie mit 7 Bildern

Die Struktur der Klasse wird nicht mehr öffentlich bekanntgegeben. Es werden lediglich Funktionen zum Erzeugen eines Objekts und zum Arbeiten mit dem Objekt veröffentlicht. Die Struktur der Klasse und die Implementierung der Funktionen werden nur als Bibliothek (Lib) verteilt und sind damit für den Benutzer der Klasse nicht mehr sichtbar. Neben dem Vorteil, dass nicht mehr auf private Elemente zugegriffen werden kann, ist es jetzt sogar möglich, das Objekt, ähnlich einem Konstruktor im C++, bei der Erzeugung zu initialisieren.

Abschließend kann gesagt werden, dass in der Programmiersprache C deutlich mehr objektorientierte Elemente aus der UML umgesetzt werden können, als auf den ersten Blick ersichtlich ist. Sogar Schutzmechanismen für private Daten sind möglich. Damit können auch C-Programme übersichtlicher und sicherer gestaltet werden.

Dieser Beitrag stammt ursprünglich von unserem Schwesterportal Embedded-Software-Engineering.de.

* Frank Listing ist seit 2002 Trainer und Projektcoach bei der MicroConsult GmbH mit dem Schwerpunkt Microsoft-Plattformen, objektorientierte Programmierung und Testen von Embedded-Systemen.

(ID:44766926)