Vulpecula
Commander
- Registriert
- Nov. 2007
- Beiträge
- 2.241
Hallo zusammen!
Ich habe eine Frage bezüglich Objekt-Instanziierung und Vererbung. Das Ganze ist Arduino-spezifisch, aber ich denke, dass der Thread in diesem Sub-Forum am besten aufgehoben ist.
Konkret geht es darum, dass ich eine Klasse erstellt habe, die eine Art "Controller" für ein LC-Display repräsentiert und für meine Bedürfnisse zugeschnittene Funktionen bietet. Innerhalb dieser Klasse wird das Display selbst (also die Schnittstelle zur Hardware) über eine externe Library als Objekt instanziiert. Mein Controller bietet mir nun Funktionen an, mit denen ich Inhalte auf die Displays bringen kann. In der Regel geht es dabei um die Formatierung und Positionierung dessen, was angezeigt wird.
Nun ist es so, dass ich drei Displays habe, die unterschiedliche Daten anzeigen (Klimadaten, Spannungen, ein Timer). Eigentlich müsste jedes dieser Displays eine eigene Controller-Klasse erhalten, da sich ein (nicht kleiner) Teil des Codes von dem der anderen unterscheidet. Aber es gibt nun mal auch gewisse Anteile, die für alle Displays gleich sind.
Hier mal eine etwas gekürzte Version meiner "generischen" Controller-Klasse:
Ich frage mich jetzt, wie ich das Ganze jetzt am besten angehe. Sicherlich könnte ich sämtliche spezifischen Funktionen innerhalb des generischen Controllers implementieren und gut ist. Allerdings hätte ich dann einen riesigen Controller, der wieder sehr unübersichtlich wird.
Eine weitere Idee wäre es, das ganze via Vererbung umzusetzen. Ich erstelle quasi eine generische Klasse, in der schon alle sich überschneidenden Funktionen implementiert sind. Zusätzlich erstelle ich für jede Art Display noch eine weitere Klasse, die von der generischen Klasse erbt und weitere Funktionen implementiert.
Nur: Wie sähe für letzteres die Instanziierung der Display-Objekte aus? Denn das Display-Objekt wird ja in der generischen Klasse erzeugt und dort vom geteilten Code auch "benutzt". Oder ist es so, dass ich einen Pointer auf das Display-Objekt an die Sub-Klassen weiterreiche?
Ich weiß nicht, ob ich mir das ganze ein wenig zu einfach vorstelle, aber vielleicht hat ja jemand ein wenig Input für mich. Vielen Dank!
Grüße,
Vulpecula
Ich habe eine Frage bezüglich Objekt-Instanziierung und Vererbung. Das Ganze ist Arduino-spezifisch, aber ich denke, dass der Thread in diesem Sub-Forum am besten aufgehoben ist.
Konkret geht es darum, dass ich eine Klasse erstellt habe, die eine Art "Controller" für ein LC-Display repräsentiert und für meine Bedürfnisse zugeschnittene Funktionen bietet. Innerhalb dieser Klasse wird das Display selbst (also die Schnittstelle zur Hardware) über eine externe Library als Objekt instanziiert. Mein Controller bietet mir nun Funktionen an, mit denen ich Inhalte auf die Displays bringen kann. In der Regel geht es dabei um die Formatierung und Positionierung dessen, was angezeigt wird.
Nun ist es so, dass ich drei Displays habe, die unterschiedliche Daten anzeigen (Klimadaten, Spannungen, ein Timer). Eigentlich müsste jedes dieser Displays eine eigene Controller-Klasse erhalten, da sich ein (nicht kleiner) Teil des Codes von dem der anderen unterscheidet. Aber es gibt nun mal auch gewisse Anteile, die für alle Displays gleich sind.
Hier mal eine etwas gekürzte Version meiner "generischen" Controller-Klasse:
C-ähnlich:
#ifndef GEN_DISP_C
#define GEN_DISP_C
#include "Arduino.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
class GenericDisplayController
{
public:
// Konstruktor
GenericDisplayController(uint8_t displayAddress, uint8_t displayColumns, uint8_t displayRows);
// öffentliche geteilte Funktionen wie z.B.
void initialize();
// öffentliche spezifische Funktionen wie z.B.
void preloadTimerDisplay();
private:
// display Objekt
LiquidCrystal_I2C _genDisplay;
// private geteilte und spezifische Funktionen...
//...
};
#endif /* GEN_DISP_C */
C-ähnlich:
#include "GenericDisplayController.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Display Objekt
LiquidCrystal_I2C _genDisplay(uint8_t displayAddress, uint8_t displayColumns, uint8_t displayRows);
// Konstruktor
GenericDisplayController::GenericDisplayController(uint8_t displayAddress, uint8_t displayColumns, uint8_t displayRows) : _genDisplay(displayAddress, displayColumns, displayRows)
{
//...
}
// öffentliche geteilte Funktionen wie z.B.
void GenericDisplayController::initialize()
{
_genDisplay.init();
_genDisplay.backlight();
_genDisplay.clear();
return;
}
// öffentliche spezifische Funktionen wie z.B.
void GenericDisplayController::preloadTimerDisplay()
{
// ...
}
Ich frage mich jetzt, wie ich das Ganze jetzt am besten angehe. Sicherlich könnte ich sämtliche spezifischen Funktionen innerhalb des generischen Controllers implementieren und gut ist. Allerdings hätte ich dann einen riesigen Controller, der wieder sehr unübersichtlich wird.
Eine weitere Idee wäre es, das ganze via Vererbung umzusetzen. Ich erstelle quasi eine generische Klasse, in der schon alle sich überschneidenden Funktionen implementiert sind. Zusätzlich erstelle ich für jede Art Display noch eine weitere Klasse, die von der generischen Klasse erbt und weitere Funktionen implementiert.
Nur: Wie sähe für letzteres die Instanziierung der Display-Objekte aus? Denn das Display-Objekt wird ja in der generischen Klasse erzeugt und dort vom geteilten Code auch "benutzt". Oder ist es so, dass ich einen Pointer auf das Display-Objekt an die Sub-Klassen weiterreiche?
Ich weiß nicht, ob ich mir das ganze ein wenig zu einfach vorstelle, aber vielleicht hat ja jemand ein wenig Input für mich. Vielen Dank!
Grüße,
Vulpecula
Zuletzt bearbeitet: