Polymorhpie in C
-
Guten Morgen! Ich komme aus der C++ Welt und muss teile eines neuen Projekts in C schreiben. Leider bin ich mit den typischerweise eingesetzten Pattern unter C kaum vertraut. Ich habe schon öfters gehört, dass man eine Art Polymorphie mit C erreichen kann, nur leider weiß ich nicht wie.
Wie löst man folgendenen OO Pseudocode mit C am elegantesten?
DBConnection db = PostgresConnection::instance(); //Andere Datenbanken werden auch unterstützt //DBConnection db = MySQLConnection::instance(); db.connect(); db.execute(); db.close();
-
^^ist ein wenig aufwändig, geht aber. wieso willste oop in C machen? geht doch bestimmt auch anders.
-
Ich würde es auch gern anders machen, nur leider fehlt mir die Erfahrung mit C wie man es elegant anders machen kann.
-
Daniel 78 schrieb:
Ich würde es auch gern anders machen, nur leider fehlt mir die Erfahrung mit C wie man es elegant anders machen kann.
oop-ähnlich kannstes machen, aber ohne polymorphie, z.b. brauchste erstmal eine struct-definition, etwa sowas:
struct db { // methods int (*open)(void); int (*executeSQL)(char *sql); int (*close)(void); // other members SOCKET sock; // tcp_connection int is_open; // open flag ... ... }
dann eine init-funktion, die die struct für ein bestimmtes DBMS vorbereitet:
int create_db (struct db *db, enum dbtype type) { switch (type) { case MYSQL: // init stuff for MySQL db->close = db2_closefunction; db->executeSQL = db2_exec; .... break; case DB2: // init DB2 ... break; case ... ... default: return -1; // wrong db type } return 1; // ok }
^^db_type ist dabei ein 'enum'
die funktionen zum db_zugriff könnten etwa so aussehen:
int open (struct db *db) { if (db->is_open) return -1; // -1 means error return db->open(); } int exec (struct db *db, char *sql) { if (!db->is_open) return -1; return db->executeSQL (sql); }
die benutzung gestaltet sich in etwa so:
void main (void) { struct db db; create_db (&db, MYSQL); if (db.open() != -1) { db.executeSQL ("delete from programming_languages where inventor=\"stroustrup\""); } }
aber, wie gesagt, in C etwas umständlich das ganze, weil man alles selber machen muss (ich weiss nicht, ob's irgendwo eine fertige abstraktions-library für datenbanken gibt). soll es auf nem mikrocontroller laufen oder wieso willst du C benutzen?
-
Da hat Dich Deine C++-Selbsterfahrungsgruppe aber reingelegt:
delete from programming_languages where inventor=\"stroustrup\"
eher so ?
delete from programming_languages where inventor='stroustrup'
-
Scheppertreiber schrieb:
Da hat Dich Deine C++-Selbsterfahrungsgruppe aber reingelegt:
nee, das kommt davon, dass ich immer zu schnell schreibe ohne nachzudenken. sollte ja nur das prinzip verdeutlichen und keine komplettlösung sein. übrigens ist ein schlimmerer fehler drin. das beispiel zum benutzen müsste so sein:
... struct db db; create_db (&db, MYSQL); if (open(&db) != -1) { execute (&db, "update users set name='schleppertreiber' where name = 'scheppertreiber'"); } ...
von wegen dynamischer polymorphie und so.
-
Ok - 1:0. Wage mal Dich zu registrieren ... dann