2016-05-22 13 views
2

die folgende Struktur (in einem Android-Java-Projekt):Backendless - Objekt speichert als Elternklasse

public abstract class A { 
    ... 
} 

public class B extends A { 
    ... 
} 

public class C extends A { 
    ... 
} 

Irgendwann sie benötigt wird eine Liste der übergeordneten Klasse-Typen zu speichern, weil wir Polymorphismus verwenden.

Aber wenn wir versuchen, ein Objekt von Muttertyp wie folgt zu speichern:

A aObject = xObject; //(xObject could be an object of type B or C) 
Backendless.Persistence.save(aObject, new AsyncCallback<A>() { ... 

Wir werden ein „Update kann nicht Objekt ohne Eigenschaften: CREATOR“ erhalten Fehler, weil wir versuchen, eine abstrakte Klasse zu speichern .

Ist es möglich, dieses Ziel zu erreichen? Der Unterschied zwischen den untergeordneten Klassen B und C besteht in der Art und Weise, in der sie einige Aktionen wie das Rendern von Bild und Text ausführen.

Edit 1: Sonderfall

Der spezielle Fall ist ein Android-App Memes zu erstellen (ein Meme ist ein lustiges Bild mit Text nach innen). In diesem Fall können Memes auf die klassische Weise gezeichnet werden, bei der es sich um ein Bild mit einem Text auf der Oberseite und einem anderen Text auf der Unterseite handelt. Meme können auch als Zitat gezeichnet werden, das ist ein Bild mit einem schwarzen Quadrat rechts, das einen Satz und den Autor unten enthält.

Um dieses Problem zu modellieren, habe ich eine abstrakte Klasse Meme erstellt, die die Attribute (name, topText, bottomText, image usw.) und die Methoden enthält, die untergeordnete Klassen zum Zeichnen des Bildes verwenden sollten, und zwei untergeordnete Klassen ClassicMeme und QuoteMeme, die das Meme auf ihre eigene Weise zeichnen.

Das Problem ist, dass wenn ein Benutzer ein Meme erstellt, er den Typ von Meme wechseln kann, um zu zeichnen, also brauche ich eine polymorphe Referenz, um mit dieser Situation umzugehen. Wenn ich fortfahre, das Meme (Basisklasse) -Objekt zu speichern, merke ich, dass das nicht möglich ist, weil Meme eine abstrakte Klasse ist, und natürlich weiß ich nicht, welche Art von Kindobjekt in dieser Basisklassenreferenz enthalten ist. (Hoffe ich habe es deutlich erklärt).

+0

Also sind alle Dateneigenschaften in der Oberklasse, und es ist mit der Persistenzschicht registriert? Was passiert, wenn Sie vom Server herunterladen? Composition ist wahrscheinlich ein besseres Modell für Sie ... – Wain

+0

Ich habe über Zusammensetzung nachgedacht, um dieses Problem zu lösen, aber ich sehe es nicht klar, können Sie bitte eine Antwort mit einem Beispiel geben? –

Antwort

1

Ihr Grund dieses Problem für ist, dass die Klassen:

einige Aktionen ausführen, wie einige Bilder und Text anders machen

Dieses Problem/Anforderung hat nichts mit Ihren Daten Modellklassen zu tun also sollte es nicht in derselben Klasse sein. Die Datenmodellklassen sollten einfache Klassen mit nur Eigenschaften und praktisch keiner Funktionalität sein.

Sie sollten also einige "Presenter" -Klassen oder etwas Ähnliches erstellen, um die Logik für die Darstellung der Daten zu besitzen. Wenn Sie die Daten anzeigen müssen, erstellen Sie eine Instanz einer dieser Klassen und übergeben Sie ihr eine Instanz einer Datenmodellklasse. Es kann dann die benötigten Daten abrufen und wie gewünscht anzeigen.

Auf diese Weise sind Ihr Datenmodell und Ihre Persistenzschicht sauber und effektiv und Sie können problemlos beliebige Präsentationsstile hinzufügen, ohne das Datenmodell zu beeinträchtigen.

+0

Entschuldigung, ich denke, ich bin nah, aber ich habe immer noch Zweifel, benutze Zusammensetzung Ich werde Klasse B und Klasse C mit 1 Attribut vom Typ A haben, wenn jede Klasse erstellt wird (A ist das Modell, eine Klasse mit nur der Persistenz) Attribute). Meine Frage an diesem Punkt ist, wie das polymorph zu handhaben ist, denn im Code sollte ich keinen Unterschied zwischen B- und C-Objekten machen und sie müssen mit dem Namen des Modells gespeichert werden. –

+0

Warum werden sie mit dem Namen des Modells gespeichert? Sind die Modellobjekte dann tatsächlich andere Typen? Sie sagten, dass die Daten identisch waren, aber auf verschiedene Arten angezeigt werden können. – Wain

+0

Sorry ich denke ich habe mich wirklich schlecht erklärt, sowohl B- als auch C-Objekte müssen mit dem Namen A-Modell gespeichert werden, denn sie sind die gleiche Darstellung eines Konzepts, das auf verschiedene Arten gezeichnet wird. –

Verwandte Themen