Ich versuche plattformunabhängigen Code zu machen, also verwende ich OOP. Zum Beispiel können Sie unter Windows, Mac OS X und Linux Fenster haben, aber auf Android haben Sie Ansichten, so dass ich versuche, dies zu abstrahieren.Gibt es in diesem Fall eine bessere Lösung als dynamic_cast?
Ich habe zunächst eine Klasse ein Fenster oder eine Ansicht darzustellen, die ich Ansicht genannt:
class View
{
public:
virtual ~View()
{}
virtual void display() = 0;
virtual void hide() = 0;
};
Das Problem ist jetzt, dass auf Android gibt es für Ansichten kein Titel ist, während unter Windows gibt es so habe ich beschlossen, erstellen eine andere Klasse:
class NameableView : public View
{
public:
virtual void setName(const std::string& name)
};
Und dann implementieren schließlich die Klassen:
class WindowsView : public NameableView
{
/* Windows implementation */
}
class AndroidView : public View
{
/* Android implementation */
}
Dann muss ich Code machen, der den Namen für eine Ansicht nur dann setzt, wenn es möglich ist (wenn er von der Klasse NameableView
erbt).
Also, wie kann ich dieses Problem lösen? Ich dachte zuerst über dynamic_cast
, aber ich höre oft, dass zu viel dynamic_cast
ein Hinweis auf ein Designproblem ist. Ich bin ein Anfänger in C++, vielleicht habe ich nicht den richtigen Weg gefunden und ich sollte das ganze Design ändern.
Machen 'setName' eine implementierte no-op-Funktion in' View'? Es ist nicht so sehr eine Abstraktion, sie dort zu haben. – StoryTeller
* "Ich versuche, plattformunabhängigen Code zu erstellen, damit ich OOP verwende." * - Das ist eine schlechte Idee, um damit anzufangen. Der Punkt von OOP, d. H. Von ** virtuellen Funktionen **, besteht darin, dass Sie die Implementierung von etwas auswählen und ändern können, während die Anwendung ausgeführt wird. –
Es ist auch eine fehlerhafte Idee, ein abstraktes "Basiskonzept" für extrem unterschiedliche GUI-Umgebungen zu entwerfen.Ein besserer Entwurf besteht darin, die GUIs unabhängig voneinander zu entwickeln, wobei jede ihren eigenen Systemanforderungen entspricht, und sie gegebenenfalls eine gemeinsame Geschäftslogikkomponente oder ein Backend verwenden zu lassen. –