2

次の構造を持つ (Android Java プロジェクト内):

public abstract class A {
   ...
}

public class B extends A {
   ...
}

public class C extends A {
   ...
}

ある時点で、ポリモーフィズムを使用しているため、親クラスの型のリストを格納する必要があります。

しかし、次のように親タイプのオブジェクトを格納しようとすると:

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

抽象クラスを保存しようとしているため、「プロパティなしでオブジェクトを更新できません: CREATOR」エラーが発生します。

この目標を達成することは可能ですか? 子クラス B と C の違いは、画像やテキストのレンダリングなどのアクションを実行する方法です。

編集1:特定のケース

特定のケースは、ミームを作成するための Android アプリです (ミームは、テキストが入った面白い画像です)。この場合、ミームは古典的な方法で描画できます。これは、上部にテキストがあり、下部に別のテキストがある画像です。ミームは引用として描画することもできます。これは、文とその下の著者を含む右側の黒い四角の画像です。

この問題をモデル化するために、属性 (name、topText、bottomText、image など) と子クラスが画像を描画するために使用するメソッドを含む抽象クラス Meme と、描画する 2 つの子クラス ClassicMeme と QuoteMeme を作成しました。独自の方法でミーム。

問題は、ユーザーがミームを作成しているときに、ミームのタイプを切り替えて描画できることです。そのため、この状況に対処するには多態的な参照が必要です。Meme (基本クラス) オブジェクトの保存に進むと、Meme は抽象クラスであるため、それが不可能であることに気付きます。もちろん、この基本クラス参照に含まれる子オブジェクトの種類はわかりません。(私が明確に説明したことを願っています)。

4

1 に答える 1

1

この問題が発生する理由は、クラスが次のとおりであることです。

一部の画像とテキストを異なる方法でレンダリングするなど、いくつかのアクションを実行します

この問題/要件は、データ モデル クラスとは関係がないため、同じクラスにあるべきではありません。データ モデル クラスは、プロパティのみを持ち、事実上機能を持たない単純なクラスである必要があります。

したがって、「プレゼンター」クラスなどを作成して、データの表示方法に関連するロジックを所有する必要があります。データを表示する必要がある場合は、これらのクラスのいずれかのインスタンスを作成し、データ モデル クラスのインスタンスに渡します。その後、必要なデータを取得し、必要に応じて表示できます。

このようにして、データ モデルと永続化レイヤーはクリーンで効果的になり、そのデータ モデルに影響を与えることなく、必要なプレゼンテーション スタイルを簡単に追加できます。

于 2016-05-26T09:34:53.043 に答える