Laden...

Design- und Verständnisfrage zu Interfaces

Erstellt von Mossi vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.767 Views
Mossi Themenstarter:in
199 Beiträge seit 2006
vor 16 Jahren
Design- und Verständnisfrage zu Interfaces

Ich versuch gerade, dass ich endlich mal die Funktion und Anwendung von Interfaces verstehe und hab dazu ein kleines Beispielprojekt angefangen. Im grunde funktioniert das auch ganz gut, aber der Sinn bleibt mir verschlossen bzw, ich glaube, dass ich einen Fehler im design habe.

Also folgendes Szenario:

Class MainForm beinhaltet das GUI und zeigt Daten aus einer Datenbank an. Dabei soll je nach Konfiguration die eine oder andere Datenbank verwendet werden

Interface IDatabase: Schreibt die benötigten Funktionen und Properties vor, die in den Database-Klassen impleentiert werden müssen.

Class FBDatabase ist von IDatabase abgeleitet und beinhaltet alle Methoden zum Arbeiten mit einer Firebird-Datenbank. Sie liefert unter anderem ein DataSet mit dem Inhalt der Datenbank zurück oder auch einzelne DataTables

Class SQLIteDatabase ist ebenfalls von IDatabase ebgeleitet und hat die gleichen Funktionen, wie die Firebird-Klasse nur eben auf SQLite zugeschnitten.

Das Grundgerüst steht also. Jetzt will ich eben aus der Mainform eine Datenbank abrufen. Das heißt, ich erstelle mir ein Objekt vom Typ IDatabase und kann dann die darin deklarierten Funktionen etc verwenden.
Nur was steht hinter dem Interface? Wie sag ich dem Interface, dass es auf die Firebird-Klasse gehen soll oder auf die SQLite-Klasse? Ich kann natürlich in der MainForm direkt ein Objekt vom Typ FBDatabase erzeugen und das dann aber in IDatabase ablegen

IDatabase m_database = new FBDatabase();

Aber damit hab ich dann ja wieder die notwendigkeit, dass die MainForm die Database-Klassen kennen muss und genau das will ich ja verhindern.

Kann mir da bitte jemand einen Tip geben, was ich bei diesem Design vergessen habe?

A
254 Beiträge seit 2007
vor 16 Jahren

Hi,

aus meiner Sicht, musst Du an irgendeiner Stelle, entweder Benutzer oder Konfig, entscheiden, welche Datenbank zum Einsatz kommt. Dort erstellts Du eine Instanz auf die Datenbank, wie Du es in deinem Code-Beispiel hast. Der Rest des Code's kann mit der Variable vom Typ IDatabase arbeiten und muss sich nicht mehr darum kümmern, welche Datenbank es nun ist. Das ist der Vorteil des Interfaces.

Tschüss

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Mossi,

ja, de Erzeugung ist der Knackpunkt. Es gibt viele Möglichkeiten, dieses zu umgehen. Eine wäre die konkrete Datenbank-Klasse in einer Konfigurationsdatei abzulegen und das konkrete Objekt per Reflection zu erzeugen (und anschließend eben über das Interface zu benutzen).

herbivore

2.187 Beiträge seit 2005
vor 16 Jahren

Ein Gutes Stichwort hierfür ist das Factory Entwurfsmuster:


IDatabase m_database = DatabaseFactory.CreateInstance();


public static class DatabaseFactory
{
  publci static IDatabase CreateInstance()
  {
    /* Hier dann dynamisch per Reflection den Typ der konkreten Datenbankklasse bestimmen */
    Type databaseType = Type.GetType(stringAusDerConfig);
     if(databaseType==null)
       throw new DatabaseTypeNotLoadableExcpetion();
     return Activator.CreateInstance(type);
  }
}

Mossi Themenstarter:in
199 Beiträge seit 2006
vor 16 Jahren

jetzt hab ich mir soviel Gedanken gemacht, in welchen Bereich ich das am besten schreibe und es war wieder falsch grml

@JuyJuka: Ich glaub, das war genau das Stichwort, das mir gefehlt hat. Also im Grunde wird dann über die Factory das jeweilige Objekt erstellt.
Danke für die Hilfe. Das werd ich mir dann gleich nochmal anschauen und weiter daran basteln in der Hoffnung, dass ich es jetzt verstanden habe.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Mossi,

jetzt hab ich mir soviel Gedanken gemacht, in welchen Bereich ich das am besten schreibe und es war wieder falsch grml

soviel Gedanken musst du dir gar nicht machen. Wenn du schon schreibst, dass du eine Designfrage hast und Design explizit in der Forenbeschreibung steht, ergibt sich "Rund um die Programmierung" eigentlich automatisch. 🙂

herbivore