|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 31.05.2005, 07:28 Titel: [Design] Plattformportabilität |
|
|
Moin,
ich habe ein eigentlich simples Designproblem. Ich habe eine abstrakte Klasse IRenderDevice, welche ein allgemeine Basisschnittstelle zum rendern darstellt. Von dieser leite ich verschiedene RenderDevices, je nach Plattform, ab, z.B. WinRenderDevice, XRenderDevice, ...
Diese Klassen sollen natürlich Singleton-Funktionalität besitzen, um global verfügbar zusein, idealerweise könnte man das Singleton-Pattern direkt in die Basisklasse integrieren, jedoch ergibt sich an dieser Stelle bereits ein Widerspruch für mich. Ein Singleton ist eine Klasse, von der genau eine Instanz erzeugt wird, eine abstrakte Klasse hingegen eine, von der gar keine erzeugt werden kann/darf. Es funktionierte auch nicht, weder mittels Standardsingleton, noch mit Meyer-Singleton...
Das ließe sich jedoch auch noch relativ einfach und elegant lösen, indem man das Singleton einfach in die abgeleiteten Klassen packt, auch wenn ich persönlich das nicht so "schön" finde...
Das eigentliche Problem besteht natürlich darin, dass ich von überall Zugriff auf die Methoden des jeweiligen Devices haben muss...
Unter Windows sähe das dann z.B. so aus:
CPP: | ::render::WinRenderDevice::getInstance()->... |
Das unschöne ergibt sich natürlich daraus, dass ich direkt auf das WinRenderDevice zugreifen muss...
Sauberer wäre es, wenn ich:
CPP: | ::render::IRenderDevice::getInstance()->... |
nutzen könnte, um die Instanz des jeweilig initialisierten Devices zubekommen (d.h. Singleton-Pattern muss wieder irgendwie in die Basisklasse, nur wie?).
Natürlich bestünde eine Möglichkeit, vor jedem Nutzen einer Device Methode mittels if zu überprüfen, welches initialisiert wurde, nur halte ich das für sehr unschön und mir würde ein ganzes Stück Flexibilität verloren gehen, weil es dann nicht mehr möglich wäre, für neue Plattformen beliebig neue Devices zuschreiben, ohne bestehenden Code zu ändern...
Wäre für Tipps wie ich das umgehen/lösen kann dankbar. Haltet ihr das überhaupt für eine vertretbare Variante, um Plattformunabhängigkeit zu erreichen? Meinungen bitte...
p.s.: Bestimmt ließe sich das auch lösen, indem ich "globale" Funktionen verwende und/oder[/code] die Device Instanzen in einerm "globalen" Pointer speicher...
Naja, ich habs halt gerne etwas OOP'iger.. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 31.05.2005, 09:20 Titel: |
|
|
Kannst du nicht auf das Singelton verzichten und das Interface statisch machen?
CPP: | #pragma once
//...
class IRenderDevice
{
public:
static IRenderDevice *getInstance() = 0;
//...
private:
IRenderDevice() = 0;
virtuel ~IRenderDevice() = 0;
};
typedef IRenderDevice IRENDERDEVICE;
typedef IRenderDevice *PIRENDERDEVICE; |
und den Konstruktor des Interfaces und damit auch der abgeleiteten Klassen privat machen... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|